单点登录解决的问题
在同一个公司开发的两个子项目时,如果就是简单的登录,我们通常就是在一个项目的pc端中进行登录,然后在另一个子项目pc端中又要进行登录,也就是说传统的登录方式是相互独立的;而这样会出现一个问题:如果我们需要在一个子项目中嵌入另一个子项目,而这时候我们如果还需要用户进行再登录,就会影响用户体验。由此,单点登录产生了
单点登录概念
在两个使用SSO实现的单点登录的项目中,我们在一个项目中进行了登录之后,在另一个项目中就不需要再次登录服务器端就可以判断出我们的身份了;这就是单点登录。单点登录分为同域SSO、部分异域SSO和完全异域SSO
同域SSO的实现
同域SSO的实现核心是通过cookie来保存用户登录状态,然后对应的项目登录都会从cookie中进行校验,判断当前是否有登录痕迹,从而判断用户身份
对于同域的实现,只需要将登录状态保存到当前域的cookie中即可,通过request/response进行存取。java对cookie相关的操作可以参考该博客: http://www.cnblogs.com/super-chao/p/6118739.html
同域SSO实现示例
(使用的SSM框架,再次不对配置做解释)
demo1前台代码
//login.jsp
<form action="login" method="post">
<label for="username">账号:</label>
<input type="text" name="username" />
<br />
<label for="password">密码:</label>
<input type="password" name="password" />
<br />
<input type="submit" value="登录" />
</form>
controller控制器代码
@Controller
public class TestController {
@RequestMapping("login")
public String login(String username, String password, HttpServletRequest request, HttpServletResponse response){
response.setCharacterEncoding("utf-8");
Cookie cookie = new Cookie("chengxi","111");
cookie.setPath("/");
response.addCookie(cookie);
return "success";
}
@RequestMapping("gologin")
public void goLogin(HttpServletRequest request, HttpServletResponse response) throws IOException{
response.setCharacterEncoding("utf-8");
Cookie[] cookies = request.getCookies();
JSONObject jsonobj = new JSONObject();
PrintWriter writer = response.getWriter();
if(cookies != null){
for(Cookie cookie: cookies){
if(cookie.getName().equals("chengxi") && cookie.getValue().equals("111")){
jsonobj.put("status","loginok");
writer.print(jsonobj);
return ;
}
}
}
jsonobj.put("status","login");
writer.print(jsonobj);
}
}
demo2项目的相应代码与demo1相同;将他们配置到tomcat之后,进行测试
访问localhost:8080/demo1/index.html和localhost:8080/demo2/index.html都会出现登录界面,而打开localhost:8080/demo2/gologin将会出现status:login字段,表示没有登录;进入demo1/index.html页面进行登录后(无论输入什么数据都会登录成功);然后输入网址localhost:8080/demo1/gologin,将会弹出{status: loginok};这时候刷新localhost:8080/demo2/gologin界面将会出现status:loginok字段,表示也登录成功,从而,实现了同域SSO登录