Spring Session -- WebSession Integration WebSession 集成

Spring Session -- WebSession Integration WebSession 集成

官网:https://spring.io/projects/spring-session

Samples:https://docs.spring.io/spring-session/reference/samples.html#samples

指引

  1. Spring Session – HttpSession Integration HttpSession集成
  2. Spring Session – WebSocket Integration WebSocket 集成
  3. Spring Session – WebSession Integration WebSession 集成
  4. Spring Session – Spring Security Integration Spring Security 集成

WebSession Integration WebSession 集成

Spring Session 提供了与 Spring WebFlux 支持的透明集成,可以使用 Spring Session 支持的实现切换实现

Java 配置

@EnableRedisWebSession
public class SessionConfiguration {

	@Bean
	public LettuceConnectionFactory redisConnectionFactory() {
		return new LettuceConnectionFactory();
	}

}
  1. @EnableRedisWebSession 注解
  2. LettuceConnectionFactory 创建了一个将 Spring Session 连接到 Redis 服务器

工作原理

与 Servlet API 及其 相比,Spring Session 与 Spring WebFlux 及其集成要容易得多。 Spring WebFlux 提供了 WebSessionStore API,它提供了持久化策略

创建一个实现 WebSession 接口的 SpringSessionWebSession 封装(委托给) Spring Session 的 Session

public class SpringSessionWebSession implements WebSession {

	enum State {
		NEW, STARTED
	}

	private final S session;

	private AtomicReference<State> state = new AtomicReference<>();

	SpringSessionWebSession(S session, State state) {
		this.session = session;
		this.state.set(state);
	}

	@Override
	public void start() {
		this.state.compareAndSet(State.NEW, State.STARTED);
	}

	@Override
	public boolean isStarted() {
		State value = this.state.get();
		return (State.STARTED.equals(value)
				|| (State.NEW.equals(value) && !this.session.getAttributes().isEmpty()));
	}

	@Override
	public Mono<Void> changeSessionId() {
		return Mono.defer(() -> {
			this.session.changeSessionId();
			return save();
		});
	}

	// ... other methods delegate to the original Session
}

创建一个实现 WebSessionStore 接口的 SpringSessionWebSessionStore 封装(委托给)ReactiveSessionRepository,SpringSessionWebSession 封装 Session

public class SpringSessionWebSessionStore<S extends Session> implements WebSessionStore {

	private final ReactiveSessionRepository<S> sessions;

	public SpringSessionWebSessionStore(ReactiveSessionRepository<S> reactiveSessionRepository) {
		this.sessions = reactiveSessionRepository;
	}

	// ...
}

WebSessionManager 封装(委托给) WebSessionStore 和 WebSessionIdResolver 作为一个 Bean 需要注册到 ApplicationContext 中,以便被 Spring WebFlux 检测到

Cookie 序列化器

// tag::webflux-cookie-serializer[]
@Bean
public WebSessionIdResolver webSessionIdResolver() {
	CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver();
	resolver.setCookieName("JSESSIONID");
	resolver.addCookieInitializer((builder) -> builder.path("/"));
	resolver.addCookieInitializer((builder) -> builder.sameSite("Strict"));
	return resolver;
}
// end::webflux-cookie-serializer[]
  1. 将cookie的名称定制为JSESSIONID
  2. 将cookie的路径定制为/(而不是默认的上下文根目录)
  3. 将SameSite cookie指令定制为Strict
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值