SpringBoot-SpringSession源码分析

2016-12-18  本文已影响899人  33d31a1032df

spring-session是用于分布式系统共享HttpSession的,可以与spring-boot结合使用,默认使用Redis作为介质。

1. EnableRedisHttpSession启用SpringSession

@Import(RedisHttpSessionConfiguration.class)
public @interface EnableRedisHttpSession {}

2. RedisHttpSessionConfiguration创建Filter

@Bean
public ... springSessionRepositoryFilter(SessionRepository<S> sessionRepository, ...) {
    SessionRepositoryFilter<S> sessionRepositoryFilter = new SessionRepositoryFilter<S>(sessionRepository);
    sessionRepositoryFilter.setServletContext(servletContext);
    if(httpSessionStrategy != null) {
        sessionRepositoryFilter.setHttpSessionStrategy(httpSessionStrategy);
    }
    return sessionRepositoryFilter;
}

3. SessionRepositoryFilter拦截所有请求

@Order(SessionRepositoryFilter.DEFAULT_ORDER)
public class SessionRepositoryFilter<...> extends OncePerRequestFilter {
    public static final int DEFAULT_ORDER = Integer.MIN_VALUE + 50;
}
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) ... {
    ...

    SessionRepositoryRequestWrapper wrappedRequest = new SessionRepositoryRequestWrapper(request, response, servletContext);
    SessionRepositoryResponseWrapper wrappedResponse = new SessionRepositoryResponseWrapper(wrappedRequest,response);

    HttpServletRequest strategyRequest = httpSessionStrategy.wrapRequest(wrappedRequest, wrappedResponse);
    HttpServletResponse strategyResponse = httpSessionStrategy.wrapResponse(wrappedRequest, wrappedResponse);

    try {
        filterChain.doFilter(strategyRequest, strategyResponse);
    } finally {
        wrappedRequest.commitSession();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读