springSession解决微服务session共享问题

硅谷探秘者 框架 204 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 4363 架构到分布式/集群的演变在传统的单架构中,一般来说,只有一个器,那么不存在Session,但是在分布式/集群项目中,Session则是一个必须面对的。在这样的集群架构中
框架 4429 springmvc项目中,如一个项目的页面调用另一个项目的接口会产生跨域403。对于一个接口而言很好跨域,springmvc中只需要在接口上加一个注。@CrossOrigin
算法基础,linux 1931 描述springboot项目在跨域名调用接口,并且需要传自定义的请求头时报错:AccesstoXMLHttpRequestat'http://ydatestapi.libawall.com
weblog 6141 什么是跨域?要了跨域,先要说说同源策略。同源策略是由Netscape公司提出的一个著名的安全策略,所有支持JavaScript的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当页面在
数据结构与算法 662 约瑟夫环描述有m个人,围成一个环,编号为1、2、3、、、m,从第一个人开始循环报数(从1开始数),假设数到n的那个人出局,然后从下一个人继续数数(从1开始数),数到n出列,以此循环,最后那个人为
java基础 6429 多线程带来的:线程有时候回和其他线程一些资源,比如内存、数据库等。当多个线程同时读写同一份资源的时候,可能会发生冲突。这时候,我们就需要引入线程“同步”机制,即各位线程之间要有顺序使用
算法基础 341 要做多机数据,通常可以存在数据库或者redis里面。而jwt不需要。无状态jwt不在端存储任何状态。RESTfulAPI的原则之一是无状态,发出请求时,总会返回带有参数的响应,不会产生附加影响。
框架 2839 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
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived
目录
祝愿神州十三飞行乘组平安归来