SpringSession+Redis实现单点登录,解决cookie的跨域问题

 

 

       如果有写的不对的地方请指出。谢谢

      本文假设你已经安装好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的信息

SpringSession+Redis实现单点登录,解决cookie的跨域问题_第1张图片

cookie的信息

SpringSession+Redis实现单点登录,解决cookie的跨域问题_第2张图片

redis中保存的信息:

SpringSession+Redis实现单点登录,解决cookie的跨域问题_第3张图片

到这里数据已经可以保存到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文件中加入:

将两个父域名一样的地址映射为本机地址

 

登录

SpringSession+Redis实现单点登录,解决cookie的跨域问题_第4张图片

使用jd.zcs.com这个域名进行登录,登录以后先使用jd.zcs.com这个域名检验是否已经登录,调用checkLogin方法验证。

SpringSession+Redis实现单点登录,解决cookie的跨域问题_第5张图片

 

 

再换tb.zcs.com这个域名验证是否登录。

SpringSession+Redis实现单点登录,解决cookie的跨域问题_第6张图片

可以看到两个域名下都有cookie,同父域名下cookie的跨域问题就解决了(没有解决跨域问题的话就是你在jd.zcs.com这个域名下登录,跳转到tb.zcs.com这个域名的页面的时候会拿不到用户的cookie,从而拿不到用户的信息)。

 

 

 

你可能感兴趣的:(redis)