springboot集成springsession

本文详细介绍了Spring Session的实现机制,通过将sessionID存储在客户端cookie并利用Redis作为会话存储,实现了分布式及跨域session管理。步骤包括引入相关依赖、配置Redis信息、设置Spring Session配置、编写Controller进行测试,并展示了通过Redis CLI查看存储的session数据。此外,还补充了如何处理a.com到b.com的跨域session保持问题。

           springsession实现原理:将sessionid保存在客户端的cookie里面,然后将该sessionid作为key将session保存在redis服务端,可以就可以实现分布式及跨域(跨域指a.com站点跳转到b.com站点保持session,需要特殊处理一下)。开始我们的实验。

           第一步:pom.xml引入相关jar

	<!--Redis起步依赖 -->
	<dependency>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-data-redis</artifactId>
	    <version>2.1.7.RELEASE</version>
	</dependency>
	<!--20210805 spring session测试 --> 
	<dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</artifactId>
            <version>2.5.1</version>
        </dependency>
        <!--Spring session data redis-->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
            <version>2.5.1</version>
        </dependency>

        第二步:配置application.properties中redis信息

spring.redis.cluster.nodes=172.17.18.133:6379,172.17.18.133:6380,172.17.18.134:6379,172.17.18.134:6380,172.17.18.135:6379,172.17.18.135:6380
spring.redis.pool.max-active=300
spring.redis.database=0
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=100
spring.redis.pool.min-idle=20
spring.redis.timeout=60000
spring.redis.password=test1234
spring.session.store-type=redis

     第三步:springsession配置

package com.figo.springboottest.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.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=1800)
public class SpringSessionConfig {
	/**
     * 更换序列化器
     * @return
     */
    @Bean("springSessionDefaultRedisSerializer")
    public RedisSerializer setSerializer(){
        return new GenericJackson2JsonRedisSerializer();
    }
}

  第四步:编写controller测试

package com.figo.springboottest.controller;

import javax.servlet.http.HttpSession;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("session")
public class SpringSessionController {
	@RequestMapping("getTestKey")
	public String  getMsg(HttpSession session) {
		
		String msg=(String) session.getAttribute("TestKey");
		return msg+"|sessionId="+session.getId();
	}
	
	
	@RequestMapping("setTestKey")
	public String  setMsg(HttpSession session) {
		
		session.setAttribute("TestKey", "Hello World!");
		return "ok|sessionId="+session.getId();
	}
}

第五步:测试springsession

设置

http://10.17.195.37:8090/springboot/session/setTestKey

获取

http://10.17.195.37:8090/springboot/session/getTestKey

通过redis-cli登录redis查看redis中的值

./redis-cli -a test1234 -c -h 172.17.18.133 -p 6379

172.17.18.133:6379> keys *

可以看到"spring:session:sessions:eb2beafe-3256-4629-a61a-8cf83d4f0aad"

172.17.18.133:6379> type spring:session:sessions:eb2beafe-3256-4629-a61a-8cf83d4f0aad
hash

172.17.18.133:6379>  hkeys spring:session:sessions:eb2beafe-3256-4629-a61a-8cf83d4f0aad
1) "lastAccessedTime"
2) "maxInactiveInterval"
3) "creationTime"
4) "sessionAttr:msg"
5) "sessionAttr:TestKey"

172.17.18.133:6379> hget spring:session:sessions:eb2beafe-3256-4629-a61a-8cf83d4f0aad sessionAttr:TestKey
"\"Hello World!\""

补充:关于跨域a.com跳转到b.com继续保持session

具体方法如下:

1. 定义CustomerCookiesSerializer

    public class DefaultCookieSerializer implements CookieSerializer {
        // 此处拷贝DefaultCookieSerializer中的代码

        // 修改getCookiePath方法体
        private String getCookiePath(HttpServletRequest request) {
            if (this.cookiePath == null) {
                // 此处改为返回根路径
                return "/";
            }
            return this.cookiePath;
        }
    }
2. 注入CustomerCookiesSerializer

    通过Spring的注解方式注入CustomerCookieSerializer到CookieHttpSessionStrategy中

    @Configuration
    @EnableRedisHttpSession 
    public class HttpSessionConfig {
         @Bean
         public CookieHttpSessionStrategy cookieHttpSessionStrategy() {
             CookieHttpSessionStrategy strategy = new CookieHttpSessionStrategy();
             strategy.setCookieSerializer(newCustomerCookieSerializer());
             return strategy;
         }
    }

参考:https://blog.csdn.net/alaska_bibi/article/details/53126456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值