公司之前有个项目是用了单点登录的,是同父域情况下操作的,刚好之前自己也学习过,对比了一下,差不多的原理,今天就笔记一下简单的一个同父域的单点登录功能。
首先在win10的hosts文件里添加下面的内容
hosts:
#
127.0.0.1 www.mail.ywj.cn
#
127.0.0.1 www.zone.ywj.cn
看得出是同父域:.ywj.cn;
操作的流程是:1、分别打开www.mail.ywj.cn,www.zone.ywj.cn,显示的都是要登录的页面,2、登录其中的一个,比如登录www.mail.ywj.cn,登录成功后,去刷新www.zone.ywj.cn
发现登录成功了。OK,流程就这个么样子。
代码流程:先加个Filter,根据session判断用户没有登录过,就查找指定的cookie,如果cookie不存在,跳到登录页面,如果指定的cookie存在,就通过cookie值找到相关的用户信息,然后就把用户信息放到session中,登录成功。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest r = (HttpServletRequest) request;
if(!r.getRequestURL().toString().endsWith("/out.do") && r.getRequestURL().toString().endsWith(".do")) {// 对.do请求做出处理,但是要去掉对退出功能out.do的处理
if(r.getSession().getAttribute("userName") == null) {// 1、当用户没有登录时,查找cookie
Cookie[] cookies = r.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie c : cookies) {
if("ywjCookie".equals(c.getName())) {// 2、找到指定的cookie(name=ywjCookie),找到后相关的cookie后就通过这个cookie查询相关的用户信息,此处省去相关查询代码
r.getSession().setAttribute("userName", "ywj");// 3、查询用户信息完毕后,把用户信息放在session中,省去这部分代码
break;
}
}
}
}
}
chain.doFilter(request, response);
}
如果找不到相关的cookie,就正常登录,登录后,把用户信息放在session中,同时生成一个cookie放在浏览器中,设置域的范围是父域
/**
* 登录
*/
@RequestMapping("/login.do")
public String login(HttpServletRequest request, HttpServletResponse response, String userName) {
// 省去各种账号密码角色权限判断
request.getSession().setAttribute("userName", userName);// 1、把用户的信息放在session中
Cookie cookie = new Cookie("ywjCookie", userName+System.currentTimeMillis());// 添加cookie,为别的系统单点登录做准备
cookie.setDomain("ywj.cn");// 设置成父域,之前的老版是要在ywj前加个.,也就是".ywj.cn"
cookie.setPath("/");
response.addCookie(cookie);
return "index";
}
/**
* 退出
*/
@RequestMapping("/out.do")
public String out(HttpServletRequest request, HttpServletResponse response) {
request.getSession().invalidate();
// 删除cookie
Cookie cookie = new Cookie("ywjCookie", "");
cookie.setMaxAge(0);
cookie.setDomain("ywj.cn");
cookie.setPath("/");
response.addCookie(cookie);
return "redirect:/index.do";
}
ok,就这个样子。。。下面登录的jsp页面
<body>
<c:if test="${empty userName}">
<form action="login.do">
<input type="text" value="ywj" name="userName"/>
<input type="submit" value="submit"/>
</form>
</c:if>
<c:if test="${!empty userName}">
hello,${userName}
<a href="out.do">log out</a>
</c:if>
</body>