Spring Session学习

系列文章目录

JavaSE
基础知识、数据类型学习万年历项目代码逻辑训练习题
代码逻辑训练习题方法、数组学习图书管理系统项目
面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习
集合学习IO流、多线程学习仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习ECMAScript、BOM学习DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习融资管理系统JavaWeb项目
框架
MyBatis框架学习逆向工程、Spring框架IOC、AOP学习SpringMVC框架学习
SpringBoot框架学习招聘网站框架项目Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习Docker学习Jenkins学习
Nexus学习Spring Security学习RabbitMQ学习
Redis学习MongoDB学习MongoDB学习
Nacos学习Spring Session学习


前言

本文我们要讲述:
Spring Session
在下攸攸太上。


一、Spring Session介绍

1. Spring Session介绍

Spring Session是一个用于管理Session的框架,特别适用于微服务架构中的分布式场景。在微服务架构中,由于应用了分布式的思想,Session无法在各个微服务之间进行共享,需要一个框架来实现Session数据的共享。Spring Session解决了这个问题。

2. Spring Session实现Session共享的方式

修改Tomcat配置文件:通过修改Tomcat的配置文件,将Session存储在外部共享的存储介质中(如Redis),从而实现Session的共享。这种方式已经不推荐使用,因为存在一些限制。

Nginx负载均衡策略:通过Nginx的负载均衡配置,采用ip_hash的方式将同一个IP的请求路由到同一个服务实例中,从而保证Session的一致性。但这种方式无法充分利用硬件资源,并且在负载均衡配置上存在一些复杂性。

Redis统一存储:这是最推荐的方式,通过将Session数据存储在Redis中,实现Session的共享和管理。Spring Boot可以很方便地集成Spring Session,并通过Nacos进行配置管理,将Session数据存储在Redis中。这种方式既可以保证Session的共享和一致性,又能充分利用硬件资源。

二、设置SpringSession

1. 启动redis,nacos

docker start redis-6379
docker start nacos

在这里插入图片描述
在这里插入图片描述

2. 创建Maven项目

在这里插入图片描述

3. 添加依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

4. 编写SpringBootMain启动类

package com.jjy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootMain {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class,args);
    }
}

5. 编写UserController控制器类

package com.jjy.controller;

import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/user")
@Setter
public class UserController {

    @GetMapping
    public String test(HttpSession session){
        return session.getId();
    }

}

6. 启动项目访问127.0.0.1:100/user

在这里插入图片描述

7. 创建第二个项目demo-session-02

在这里插入图片描述
更改pom文件中artifactId为:demo-session-02
在这里插入图片描述
修改application.yml中port为:200
在这里插入图片描述

8. 启动两个项目,实现效果

两个Session的ID不同
在这里插入图片描述

三、统一Session

以下两个文件都要同时操作,如果需要分别操作,会特别标识

1. 添加依赖

在dependencies标签下添加子标签

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2. 修改application.yml配置文件

注意缩进

spring:
  session:
    store-type: redis

在这里插入图片描述

3. 编写application.properties配置文件

spring.application.name=sessiondemo

4. 添加Nacos-Redis配置

在配置管理的配置列表中选择nacos0926
其中nacos0926是昨天文章Nacos学习内新建的命名空间,可以在命名空间下新建,填写名字、描述即可,ID会自动生成
在这里插入图片描述
在这里插入图片描述
填写ID(必须以.yaml结尾)、描述(随意)、配置内容、配置格式选择YAML
所有设置好后,点击发布
在这里插入图片描述
在这里插入图片描述

5. 编写bootstrap.yml配置文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.108.186:8848
      config:
        server-addr: 192.168.108.186:8848 #
        file-extension: yaml
        namespace: 7e56a725-f51a-4603-b421-49add0ae9c4b # 命名空间ID,粘贴复制过来即可。
        shared-configs:
          - data-id: redissession1.yaml    # 配置详情内:Data ID,粘贴复制过来即可。
            group: DEFAULT_GROUP           # 配置详情内:Group 粘贴复制过来即可。
    inetutils:
      preferred-networks: 192.168.56 # 服务管理内,public内点击详情,可以查看,需要项目启动后能查看,一般默认192.168.56

6. 更改SpringBootMain启动类

添加@EnableRedisHttpSession注解
在这里插入图片描述

7. 编写SessionConfig配置类

package com.jjy.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

/**
 * @author alen
 * @date 2024/9/27 10:27:04
 */
@Configuration
public class SessionConfig {

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

    @Bean
    public RedisSerializer<Object> redisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }

}

8. 启动两个项目,实现效果

启动后查看服务列表,发现实例数有2
在这里插入图片描述
在这里插入图片描述
在两个项目页面中,session同步了,这样这两个项目就能共享session信息
在这里插入图片描述


总结

本文讲述了:
Spring Session:让两个项目共享会话,使生存域是会话的变量能够在项目间共享
在下攸攸太上,最近疯狂发文章,只是为了得到一周九篇才能拿到的劳模勋章,距离劳模勋章还差2篇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值