如果有写的不对的地方请指出。谢谢
本文假设你已经安装好redis并且可以使用java正常对redis数据库进行操作。
为什么要使用单点登录:在一些比较大的项目中,一个项目会分为很多模块,每个模块都会部署到单独的服务器,使用原生的HttpSession只能将session保存在一台服务器,不能实现资源共享,这样就造成可能用户已经在A服务器登录了,但是跳转到B服务器的时候这个用户的登录信息就拿不到了,B服务器就不知道你是谁。
使用SpringSession+Redis实现的单点登录可以解决这个问题。
SpringSession+Redis实现单点登录的原理:使用springSession创建会话的时候,springSession会创建一个cookie,key是“SESSION”,value是springSession生成的类似于uuid的字符串,然后springSession还会在Redis中保存你创建会话时传入的用户信息(使用的是hash类型保存的数据),key就是cookie的value,value保存的就是真正的用户信息,服务器判断你有没有登录就是拿着cookie的value与redis的key做对比,如果redis中有key等于cookie的value,那么这么用户就是已经登录的用户,否则就是没有登录。
springSessio的使用:
1.首先引入依赖
org.springframework.session
spring-session
1.3.1.RELEASE
2.在web.xml中配置springSession过滤器
springSessionRepositoryFilter
org.springframework.web.filter.DelegatingFilterProxy
springSessionRepositoryFilter
/*
3. 在redis配置文件加上springsession管理Redis的核心配置bean
到这里springSession已经配置完成了,原来的session怎么使用springSession就怎么使用。
例:
使用springSession存储用户信息:
@RequestMapping("login")
public String login(HttpSession session) {
session.setAttribute("user", "用户信息");
//设置session的存活时间
session.setMaxInactiveInterval(3600);
return "loginSuccess";
}
当你登录成功后可以查看springSession生成的cookie信息:
点击浏览器的感叹号会弹出cookie的信息
cookie的信息
redis中保存的信息:
到这里数据已经可以保存到redis中去了。
解决cookie的跨域问题(父域名相同的情况):
在springsession管理Redis的核心配置bean中添加父域名信息
添加完成后验证是否可以跨域:
在springmvc中写一个检验是否已经登录的方法:
/**
* 验证是否登录
*/
@ResponseBody
@RequestMapping("checkLogin")
public SysUser checkLogin(HttpSession session) {
SysUser user =(SysUser) session.getAttribute("user");
return user;
}
在本地修改host文件演示cookie跨域问题
我这里设置的父域名是.zcs.com
在 C:\Windows\System32\drivers\etc文件中加入:
将两个父域名一样的地址映射为本机地址
登录
使用jd.zcs.com这个域名进行登录,登录以后先使用jd.zcs.com这个域名检验是否已经登录,调用checkLogin方法验证。
再换tb.zcs.com这个域名验证是否登录。
可以看到两个域名下都有cookie,同父域名下cookie的跨域问题就解决了(没有解决跨域问题的话就是你在jd.zcs.com这个域名下登录,跳转到tb.zcs.com这个域名的页面的时候会拿不到用户的cookie,从而拿不到用户的信息)。