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 类继承图
根据类名猜测 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)]