springSession解决微服务session共享问题

硅谷探秘者 框架 410 0 0

一、创建项目

创建两个项目projectA,projectB

二、pom文件相同

<parent>
        <artifactId>springSession</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>

三、配置文件相同,除端口外

server:
  port: 8801
  servlet:
    context-path: /
spring:
  redis:
    host: 192.168.183.131
    port: 6379
    password: 123456
    database: 0

四、Controller控制器相同

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;

@RestController
public class TestPAController {

    @GetMapping("set")
    public String set(HttpSession session,String value){
        session.setAttribute("name",value);
        return "ok";
    }


    @GetMapping("get")
    public String set(HttpSession session){
        String value = (String)session.getAttribute("name");
        return value;
    }
}

此时在一个项目中调用set方法,在另一个项目调用get方法就能实现session共享,例如:
http://localhost:8801/set?value=zhejiushi
http://localhost:8802/get

五、配置context-path

在配置文件中配置context-path会使session共享失效例如:

server:
  port: 8801
  servlet:
      context-path: /pa

访问:
http://localhost:8801/pa/set?value=zhejiushi
http://localhost:8802/pb/get
此时则无法实现session共享

原因:cookie所在目录不同

项目A所在目录是pa,项目b所在目录是pb。

解决方法将两个项目的cookie的所在目录设置成根目录(/)就可以了

六、配置

在两个项目中都添加如下配置类:

   @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("SESSION");
        serializer.setCookiePath("/");
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
        return serializer;
}

重启项目就解决了。

猜你喜欢
weblog 4577 架构到分布式/集群的演变在传统的单架构中,一般来说,只有一个器,那么不存在Session,但是在分布式/集群项目中,Session则是一个必须面对的。在这样的集群架构中
框架 4595 springmvc项目中,如一个项目的页面调用另一个项目的接口会产生跨域403。对于一个接口而言很好跨域,springmvc中只需要在接口上加一个注。@CrossOrigin
算法基础,linux 2613 描述springboot项目在跨域名调用接口,并且需要传自定义的请求头时报错:AccesstoXMLHttpRequestat'http://ydatestapi.libawall.com
weblog 6413 什么是跨域?要了跨域,先要说说同源策略。同源策略是由Netscape公司提出的一个著名的安全策略,所有支持JavaScript的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当页面在
数据结构与算法 837 约瑟夫环描述有m个人,围成一个环,编号为1、2、3、、、m,从第一个人开始循环报数(从1开始数),假设数到n的那个人出局,然后从下一个人继续数数(从1开始数),数到n出列,以此循环,最后那个人为
java基础 6570 多线程带来的:线程有时候回和其他线程一些资源,比如内存、数据库等。当多个线程同时读写同一份资源的时候,可能会发生冲突。这时候,我们就需要引入线程“同步”机制,即各位线程之间要有顺序使用
算法基础 450 要做多机数据,通常可以存在数据库或者redis里面。而jwt不需要。无状态jwt不在端存储任何状态。RESTfulAPI的原则之一是无状态,发出请求时,总会返回带有参数的响应,不会产生附加影响。
框架 3071 shiroajax访拦截返回json串在shiro自定义拦击的时候一般会继承AuthorizationFilter类重写isAccessAllowed()方法。该方法会根据我们自定义的规则通过
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础
目录
余生别太较劲,放过自己 才会幸福。