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

  • Post author:
  • Post category:其他



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


本文假设你已经安装好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,从而拿不到用户的信息)。



版权声明:本文为weixin_38860401原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。