• 快站
  • 畅言
帮助中心
单点登录 Java版Demo

亲爱的站长,如果你的网站采用java语言开发,可以参考下面的java版单点登录Demo

1、开启单点登录服务

首先在你的畅言后台 设置-PC端设置-单点登录,勾选单点登录框,按需要上传登录头像,填写你的登录页面,最后完成三个接口地址填写,如下图所示。(注:如果对三个接口的含义不明确,请参照单点登录接口文档

2、开始编写你的接口代码

获取用户信息接口,返回的参数列表用两个Java Bean表示

UserInfo对象,它含有is_login属性和User对象

public class UserInfo implements Serializable{
   
       public int is_login;//是否登录,0表示未登录,1表示已登录
    
       public User user; //用户信息

       public int getIs_login() {
          return is_login;
       }

       public void setIs_login(int is_login) {
          this.is_login = is_login;
       }

       public User getUser() {
          return user;
       }

       public void setUser(User user) {
          this.user = user;
       }
    
    }
	

User对象,包含用户id,昵称,用户头像url,用户主页url,签名sign属性

public class User implements Serializable{
    
      public int user_id;//用户在自己网站的id
    
      public String nickname;//用户昵称
    
      public String img_url;//用户头像地址
    
      public String profile_url;//用户主页地址
    
      public String sign;//签名

      public int getUser_id() {
          return user_id;
      }

      public void setUser_id(int user_id) {
          this.user_id = user_id;
      }

      public String getNickname() {
          return nickname;
      }

      public void setNickname(String nickname) {
          this.nickname = nickname;
      }

      public String getImg_url() {
          return img_url;
      }

      public void setImg_url(String img_url) {
          this.img_url = img_url;
      }

      public String getProfile_url() {
          return profile_url;
      }

      public void setProfile_url(String profile_url) {
          this.profile_url = profile_url;
      }

      public String getSign() {
          return sign;
      }

      public void setSign(String sign) {
          this.sign = sign;
      }
  
   }
	

后台逻辑代码,包括获取用户信息接口getUserInfo,用户登录接口login,用户退出接口loginout。注意此代码只简单模拟了用户登录或未登录时分别返回的参数形式,具体的业务逻辑还需站长自己添加

@Controller
@RequestMapping("/labs/test")
public class TestController {
    
    
	//该接口只有当畅言已登录,getUserInfo返回未登录时,才会被调用用来登录自身网站
    @RequestMapping("login")
    public void loginByCy(@RequestParam(value = "callback") String callback,
            @RequestParam(value = "user_id") String user_id, 
			@RequestParam(value = "nickname") String nickname,
            @RequestParam(value = "sign") String sign, @RequestParam(value = "img_url") String img_url,
            @RequestParam(value = "profile_url") String profile_url, HttpServletResponse resp) {
	    //自己网站的登录逻辑,记录登录信息到cookie
		Cookie cookie = new Cookie("user_id", user_id);
		... ....
		resp.addCookie(cookie);
        resp.getWriter().write(callback + "({\"user_id\":"+user_id+",reload_page:0})");
    }
    
    @RequestMapping("loginout")
    public void loginBySite(@RequestParam(value = "callback") String callback,HttpServletResponse resp) {
        //清除自己网站cookies信息,同时前端logout.js代码用来清理畅言cookie
        resp.getWriter().write(callback + "({\"code\":\"1\",reload_page:0, js-src:logout.js})");
    }

    //该接口在页面每一次加载时都会被调用,用来判断用户在自己网站是否登录
    @RequestMapping("getUserInfo")
    public void getUserInfo(@RequestParam(value = "callback") String callback, HttpServletRequest res,
	HttpServletResponse resp) {
        UserInfo userinfo = new UserInfo();
        Cookie[] cookies = res.getCookies();
        if(!isContains("user_id", cookies)){//此处为模拟逻辑,具体实现可以变化
            userinfo.setIs_login(0);//用户未登录
        }else{
            userinfo.setIs_login(1);//用户已登录
            User user = new User();
            user.setUser_id(getCookValue("user_id",cookies)); //该值具体根据自己用户系统设定
            user.setNickname(getCookValue("nickname",cookies)); //该值具体根据自己用户系统设定
            user.setImg_url(getCookValue("img_url",cookies)); //该值具体根据自己用户系统设定,可以为空
            user.setProfile_url(getCookValue("profile_url",cookies));//该值具体根据自己用户系统设定,可以为空
            user.setSign(getCookValue("sign",cookies)); //签名已弃用,任意赋值即可
            userinfo.setUser(user);
        }
        resp.setContentType("application/x-javascript");//指定传输格式为js
        resp.getWriter().write(callback+"("+JSONArray.toJSONString(userinfo)+")");//拼接成jsonp格式
    }

    //该方法判断cookie中是否存在键值为key的value值
	public boolean isContains(String key, Cookie[] cookies){
        for(Cookie cookie : cookies){
            if(cookie.getName().equals(key)){
                if(cookie.getValue()!=null){
                    return true;
                }else{
                    return false;
                }
            }
        }
        return false;
    }
    
	//该方法获取cookie中键值为key的value值
    public Object getCookieValue(String key,Cookie[] cookies){
        for(Cookie cookie :cookies){
            if(cookie.getName().equals(key))
                return cookie.getValue();
        }
        return null;
    }
    
}
	

当首次加载测试页时,两者都未登录,出现单点登录按钮,如图所示:

畅言调用getUserInfo接口查看网站用户是否登录,这里getUserInfo接口返回未登录

点击单点登录按钮,跳转到登陆页面,如图所示:

登录成功后,刷新页面,发现畅言和网站两者均以登录,且评论框底部登录按钮也已消失。如图所示:

这是因为getUserInfo返回登录时,畅言会根据其返回的参数再次登录。如图所示:

保留畅言登录状态(不去除cookie),设置网站用户未登录,重新刷新页面,这时畅言已登录,getUserInfo返回未登录,则会调用用户的login登录接口,请求如图所示:

这样就大功告成了!您学会了吗?