如果有写的不对的地方请指出。谢谢
本文假设你已经安装好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.首先引入依赖
<!– https://mvnrepository.com/artifact/org.springframework.session/spring-session –>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
2.在web.xml中配置springSession过滤器
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. 在redis配置文件加上springsession管理Redis的核心配置bean
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
</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中添加父域名信息
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="cookieSerializer">
<bean class="org.springframework.session.web.http.DefaultCookieSerializer">
<!--设置父域名-->
<property name="domainName" value=".zcs.com"></property>
<!--路径-->
<property name="cookiePath" value="/"></property>
<!--防xss跨站脚本攻击-->
<property name="useHttpOnlyCookie" value="true"></property>
</bean>
</property>
</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,从而拿不到用户的信息)。