如果有写的不对的地方请指出。谢谢
    
   
    
     本文假设你已经安装好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,从而拿不到用户的信息)。
    
   
 
