springboot 整合 spring session做session共享

今天给大家简单介绍下spring session的使用。本篇主要介绍使用redis做存储,话不多说直接撸代码。

– 下面是pom 只需要额外引入redis 和 session的jar就ok。

   
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.session
            spring-session-data-redis
        

– 有关配置 很简洁

server.port=8080
#redis配置
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
#设置存储格式
spring.session.hazelcast.map-name=spring:session:demo
#设置session刷新ON_SAVE(表示在response commit前刷新缓存),IMMEDIATE(表示只要有更新,就刷新缓存)
spring.session.redis.flush-mode=on_save
# 选择使用redis 作为session存储
spring.session.store-type=redis
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @RestController
    @RequestMapping
    class Test {
        @GetMapping("/session")
        public String session(HttpServletRequest request) {
            return "session: " + request.getSession().getId() + "  port: " + request.getServerPort();
        }
    }
}

接下来就是启动两个服务 端口分别为 8888 和 8080,进行调用。

springboot 整合 spring session做session共享_第1张图片

springboot 整合 spring session做session共享_第2张图片
在这里插入图片描述

很明显访问两个端口的服务 获取到的sessionId是一致的,那就表明我们的session共享做成功了。
另外需要注意的是在spring-session中提到,由于redis的ttl删除key是一个被动行为,所以才会引入了expirations这个key,来主动进行session的过期行为判断。

!!!那重点来了,他是怎么做到session共享的。

springboot 整合 spring session做session共享_第3张图片

上面的图我们可以看到,我们的session已经被替换了,利用filter对session进行了包装。
不仅如此,它本身对cookie也进行了base64Encode转码。默认的spring session生成的sessionId为转码串了。

class DefaultCookieSerializer{

@Override
	public void writeCookieValue(CookieValue cookieValue) {
		HttpServletRequest request = cookieValue.getRequest();
		HttpServletResponse response = cookieValue.getResponse();

		String requestedCookieValue = cookieValue.getCookieValue();
		String actualCookieValue = this.jvmRoute == null ? requestedCookieValue
				: requestedCookieValue + this.jvmRoute;

		Cookie sessionCookie = new Cookie(this.cookieName, this.useBase64Encoding
				? base64Encode(actualCookieValue) : actualCookieValue);
		sessionCookie.setSecure(isSecureCookie(request));
		sessionCookie.setPath(getCookiePath(request));
		String domainName = getDomainName(request);
		if (domainName != null) {
			sessionCookie.setDomain(domainName);
		}

		if (this.useHttpOnlyCookie) {
			sessionCookie.setHttpOnly(true);
		}

		if (cookieValue.getCookieMaxAge() < 0) {
			if (this.rememberMeRequestAttribute != null
					&& request.getAttribute(this.rememberMeRequestAttribute) != null) {
				// the cookie is only written at time of session creation, so we rely on
				// session expiration rather than cookie expiration if remember me is enabled
				cookieValue.setCookieMaxAge(Integer.MAX_VALUE);
			}
			else if (this.cookieMaxAge != null) {
				cookieValue.setCookieMaxAge(this.cookieMaxAge);
			}
		}
		sessionCookie.setMaxAge(cookieValue.getCookieMaxAge());

		response.addCookie(sessionCookie);
	}
}

springboot 整合 spring session做session共享_第4张图片

你可能感兴趣的:(Spring,session)