springsession自定义sessionid存放位置

springsession自定义sessionid存放位置

提出问题

如果客户端不支持 cookie , 那么 springsession 默认配置不可以使用

如果客户端是手机app,非浏览器,就不能通过 cookie 来访问 session 对象

spring 基于 redis 整合 session 共享

参考:

https://blog.csdn.net/shaoming314/article/details/121313390

spring session 中 自动装配配置说明

....
public class SessionAutoConfiguration {	
/**
	 * Condition to trigger the creation of a {@link DefaultCookieSerializer}. This kicks
	 * in if either no {@link HttpSessionIdResolver} and {@link CookieSerializer} beans
	 * are registered, or if {@link CookieHttpSessionIdResolver} is registered but
	 * {@link CookieSerializer} is not.
	 */
	static class DefaultCookieSerializerCondition extends AnyNestedCondition {

		DefaultCookieSerializerCondition() {
			super(ConfigurationPhase.REGISTER_BEAN);
		}

		@ConditionalOnMissingBean({ HttpSessionIdResolver.class, CookieSerializer.class })
		static class NoComponentsAvailable {

		}

		@ConditionalOnBean(CookieHttpSessionIdResolver.class)
		@ConditionalOnMissingBean(CookieSerializer.class)
		static class CookieHttpSessionIdResolverAvailable {

		}

	}
    
....    

HttpSessionIdResolver.java 是 sessionid 解析器

如果不自定义 HttpSessionIdResolver.java

那么 默认使用 CookieHttpSessionIdResolver.java 进行解析 sessionId 操作

查看 HttpSessionIdResolver 类继承图

image-20221017000627628

根据类名猜测 HeaderHttpSessionIdResolver.java 是 基于 head 参数解析 sessionId 操作

查看类具体信息

我们可以自定义 head 参数名称 存放 sessionid

public class HeaderHttpSessionIdResolver implements HttpSessionIdResolver {
    ...
	public HeaderHttpSessionIdResolver(String headerName) {
		if (headerName == null) {
			throw new IllegalArgumentException("headerName cannot be null");
		}
		this.headerName = headerName;
	}
}

测试 sessionid 基于 head

说明:

测试 sessionid 存放在 token 中

token 是 head 的参数

我们设置 head 中 Authorization=sessionId

初始化springboot项目

引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.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-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>
    </dependencies>


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

</project>

根据官网案例整合redis

设置 redis 连接信息

spring.redis.host=www.vagrant.com
spring.redis.password=root
spring.redis.port=6379

设置 springsession 整合 session 配置类

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
    @Bean
    public HttpSessionIdResolver sessionIdResolver(){
        return new HeaderHttpSessionIdResolver("Authorization");
    }
}

测试 controller 方法

@RestController
public class HelloController {


    @GetMapping("/hello")
    public String hello() {
        return "hello springboot - springmvc -----------";
    }

    @GetMapping("/set-session")
    public Object writeSession(String sessionVal, HttpSession httpSession) {
        System.out.println("Param 'sessionVal' = " + sessionVal);
        httpSession.setAttribute("sessionVal", sessionVal);
        String id = httpSession.getId();
        return sessionVal + ":    "+ id;
    }

    @GetMapping("/get-session")
    public Object readSession(HttpSession httpSession) {
        Object obj = httpSession.getAttribute("sessionVal");
        System.out.println("'sessionVal' in Session = " + obj);
        return obj;
    }
}

分别以两个端口启动项目

8080

8088

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PHlJcmKr-1665937218840)(D:\my-note\typora-picture\image-20221017001624974.png)]

测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PqDNRDK-1665937218841)(D:\my-note\typora-picture\image-20221017001703897.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8Tf7608-1665937218841)(D:\my-note\typora-picture\image-20221017001759010.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dyoyqTWi-1665937218841)(D:\my-note\typora-picture\image-20221017001839373.png)]

`

分别以两个端口启动项目

8080

8088

[外链图片转存中…(img-PHlJcmKr-1665937218840)]

测试

[外链图片转存中…(img-1PqDNRDK-1665937218841)]

[外链图片转存中…(img-z8Tf7608-1665937218841)]

[外链图片转存中…(img-dyoyqTWi-1665937218841)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNWzBWZM-1665937218842)(D:\my-note\typora-picture\image-20221017001914198.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值