我正在使用Redis作为存储来共享服务之间的会话。我在春季的微服务架构应用程序中使用下一个依赖项:
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.session:spring-session-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
要从一种服务调用到另一种服务,我正在使用Spring RestTemplate和拦截器。我通过以下方式参加会议:
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
String sessionId = requestAttributes.getSessionId();
并将其插入到我的拦截器中的cookie中。当我在本地测试我的应用程序且没有会话共享(即没有redis)时,所有程序都可以正常工作
spring.session.store-type=none
但是,当我使用Redis会话共享(spring.session.store-type=redis
)进行测试时,我的服务无法调用其他服务,并收到错误消息(未经授权)。在日志中,没有重做的会话采用编码形式,例如SESSION = MGFlMGY5YmQtYmMzNS00Yzg0LTk3Y2YtYzcwZjM2ZDI2MTY0。但是,当我在拦截器中打开redis 支持时,我获得了已解码UUID格式的会话,例如SESSION = 5fc03087-d265-11e7-b8c6-83e29cd24f4c。
在我的拦截器中,我在启用redis时编码会话:
String encodedSessionId = new String(Base64.getEncoder().encode(sessionId.getBytes()));
一切正常。但是我不明白为什么当redis有效时,会话解码了吗?我了解使用DefaultCookieSerializer ...但是为什么要对会话进行解码?必须对其进行编码。