文档章节

Spring-Boot(六) Spring Session 分布式会话管理

nealma
 nealma
发布于 2017/03/15 11:07
字数 640
阅读 1634
收藏 1

 

http://nealma.com/2016/11/01/spring-boot-6-spring-session/

开发环境:
OS: Mac 10.11.6
IDE: IDEA
Build: Maven

### Spring Session 是什么

    其实也不是什么新鲜的事儿?我们在实现用户登录,授权的时候,最初是web场景,我们只需要在Cookies中
    操作即可,现在我们面临移动端、open API等多种场景,单纯的Cookies已经不满足或者不能优雅的体现Restful
    风格,此时需要在Header上动手脚,也就是把原来存放在Cookies中的信息移到了Header中,换汤不换药

### 在Web中使用CookieHttpSessionStrategy

```java

    @Bean
    public HttpSessionStrategy httpSessionStrategy() {
        return new CookieHttpSessionStrategy();
    }
```

### 在Header中使用HeaderHttpSessionStrategy

```java

    @Bean
    public HttpSessionStrategy httpSessionStrategy() {
        return new HeaderHttpSessionStrategy();
    }
```

### Session 外部存储
    
    单纯的把Session信息存在JVM内容已经不适合现在的技术架构,再加上外部存储的开源产品足够成熟(Redis等),
    于是Sping Session对HttpSession进行了重新包装,使其很容易结合Redis等开源产品,节省了我们的开发时间。
    只需要在你自己实现的WebSecurityConfigurerAdapter中加上如下注解:

```
@EnableRedisHttpSession
```

### Cookies和Header混合支持

    但是在使用的过程中遇到一个问题,需要Cookie和Header都支持,这下麻烦了,还需要自己去实现,
    怎么才能都支持呢?那就是在自己实现的AllHttpSessionStrategy中,对Request进行判断,如果是html,就使用
    CookieHttpSessionStrategy,如果是API就用HeaderHttpSessionStrategy,具体如下:

```
  @Bean
    public HttpSessionStrategy httpSessionStrategy() {
        return new MyHttpSessionStrategy(new HeaderContentNegotiationStrategy());
    }

```

这里的MyHttpSessionStrategy是要自己实现的

```
public class MyHttpSessionStrategy implements HttpSessionStrategy {
    private HttpSessionStrategy browser;

    private HttpSessionStrategy api;

    private RequestMatcher browserMatcher;

    @Autowired
    public MyHttpSessionStrategy(ContentNegotiationStrategy contentNegotiationStrategy) {
        this(new CookieHttpSessionStrategy(), new HeaderHttpSessionStrategy());
        MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(contentNegotiationStrategy,
                Arrays.asList(MediaType.TEXT_HTML));
        matcher.setIgnoredMediaTypes(Collections.singleton(MediaType.ALL));

        RequestHeaderRequestMatcher javascript = new RequestHeaderRequestMatcher("X-Requested-With");

        this.browserMatcher = new OrRequestMatcher(Arrays.asList(matcher, javascript));
    }

    public MyHttpSessionStrategy(HttpSessionStrategy browser, HttpSessionStrategy api) {
        this.browser = browser;
        this.api = api;
    }

    @Override
    public String getRequestedSessionId(HttpServletRequest request) {
        return getStrategy(request).getRequestedSessionId(request);
    }

    @Override
    public void onNewSession(Session session, HttpServletRequest request, HttpServletResponse response) {
        getStrategy(request).onNewSession(session, request, response);
    }

    @Override
    public void onInvalidateSession(HttpServletRequest request, HttpServletResponse response) {
        getStrategy(request).onInvalidateSession(request, response);
    }

    private HttpSessionStrategy getStrategy(HttpServletRequest request) {
        return this.browserMatcher.matches(request) ? this.browser : this.api;
    }
}
```

### 结束
    这样无论是网页端还是RESTFull API,都可以正常支持了。
    网页端通过cookie来传递session,API使用的是x-auth-token。
    这里有个问题就是还不知道怎么去更新Redis中会话信息,待续...

© 著作权归作者所有

nealma
粉丝 2
博文 25
码字总数 4025
作品 0
朝阳
CTO(技术副总裁)
私信 提问
加载中

评论(1)

苏珊大妈
苏珊大妈
看到这文章我两眼泪流满面,,正是我所需要的呀,但你是用的Spring Security,我是用的Shiro.我先看看。感谢
次世代的会话管理项目 Spring Session

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,由Tnecesoc编译。 会话管理一直是 Java 企业级应用的重要部分。不过在很长的一段时间里,这一部分都被我...

腾讯云加社区
2018/06/26
0
0
Spring Boot 使用 Spring Session 集成 Redis 实现Session共享

Spring Boot 使用 Spring Session 集成 Redis 实现Session共享 《Spring Boot 2.0极简教程》—— 基于 Gradle + Kotlin的企业级应用开发最佳实践 通常在web开发中,Session 会话管理是很重要...

程序员诗人
2018/04/17
0
0
spring-boot整合spring-session,使用redis共享

本文讲述spring-boot工程中使用spring-session机制进行安全认证,并且通过redis存储session,满足集群部署、分布式系统的session共享。 java工程中,说到权限管理和安全认证,我们首先想到的...

louieSun
2018/05/13
0
0
Spring Boot 解决方案 - 会话

Spring Boot 解决方案 - 会话 连接无状态 使用 HTTP 的连接是无状态的,因此为了应对需要状态的服务例如用户登录,诞生了适合保存状态的设计-会话(session),本文就来探讨一下会话。 会话的...

优惠券发放
03/30
0
0
分布式系统 - iBase4J

Spring boot,Spring,SpringMVC,Mybatis,mybatis-plus,motan/dubbo分布式,Redis缓存,Shiro权限管理,Spring-Session单点登录,Quartz分布式集群调度,Restful服务,QQ/微信登录,App t...

iBase4J
2016/05/04
138.9K
77

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Sleuth 整合 feign 源码分析之修改span名称

org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClient 包括创建span一些参数 需求场景: 由于项目中有restful 风格的http请求,sleuth feign 的span名称默认是u...

xiaomin0322
32分钟前
4
0
Less 延伸

extend 是一个 Less 伪类,它通过使用 :extend 选择器在一个选择器中扩展其他选择器样式。 扩展语法 扩展可以是附加到选择器,也可以是集中放置在规则,看上去像是带有选择器参数的可选伪类,...

凌兮洛
33分钟前
4
0
RedHat 7.0系统中安装mysql 5.7.22

在安装之前,首先要查看的是,你的系统中有没有已经安装过的情况。键入rpm -qa|grep mysql,如果无任何显示,则表示没有安装过相关组件,如果有,则根据显示出来的名字,键入rpm -e --nodeps...

最菜最菜之小菜鸟
38分钟前
4
0
RPA:企业信息孤岛的“克星”

为了降本增效,近来世界范围内掀起一股流程优化的热潮,转型升级成为众多企业时刻挂在嘴边的热词。不过在企业数字化转型的过程中,信息孤岛的出现,往往成为了企业升级的绊脚石。 信息孤岛:...

UiBot
38分钟前
4
0
我的测试

我的测试

daiison
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部