单点登录 Java版Demo
亲爱的站长,如果你的网站采用java语言开发,可以参考下面的java版单点登录Demo
首先在你的云评论后台 设置-PC端设置-单点登录,勾选单点登录框,按需要上传登录头像,填写你的登录页面,最后完成三个接口地址填写,如下图所示。(注:如果对三个接口的含义不明确,请参照单点登录接口文档)

获取用户信息接口,返回的参数列表用两个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登录接口,请求如图所示:
