【spring boot】整合spring-session存储redis,header读取

一·背景

自己的个人项目准备做前后端分离了,也会考虑使用WebSocket,要考虑session一个读取,和存储的问题,当然这块自己写代码也可以解决,使用spring-session就可以使用现成较成熟的方案了。

二·方案选择

使用spring-session去实现也有多种方案去选择

1·session是存储:redis、jvm内存map、mongo、gemfire、hazelcast、jdbc,我这里选择存储到redis

2·session通过cookie 读取 还是通过header读取,我这里选择header

三·集成


    org.springframework.boot
    spring-boot-starter-parent
    1.5.9.RELEASE
     

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

    org.springframework.session
    spring-session-data-redis
    1.3.1.RELEASE

    biz.paluch.redis
    lettuce
    4.4.2.Final

如果是自己写,不使用spring-session的话可以考虑使用:


    io.jsonwebtoken
    jjwt
    0.9.0

四·使用

1·创建session配置类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.HeaderHttpSessionStrategy;
import org.springframework.session.web.http.HttpSessionStrategy;

/**
 * 说明:
 *
 * @author WangBin
 * @version v1.0
 * @date 2018/1/27/027.
 */
@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {

    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;

    /**
     * RedisHttpSession 创建 连接工厂
     *
     * @return
     */
    @Bean
    public LettuceConnectionFactory connectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

    /**
     * 自定义 Token
     *
     * @return
     */
    @Bean
    public HttpSessionStrategy httpSessionStrategy() {
        HeaderHttpSessionStrategy headerHttpSessionStrategy = new HeaderHttpSessionStrategy();
        headerHttpSessionStrategy.setHeaderName("Token");
        return headerHttpSessionStrategy;
    }
}

@EnableRedisHttpSession 

public @interface EnableRedisHttpSession {
    int maxInactiveIntervalInSeconds() default 1800;

    String redisNamespace() default "";

    RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE;
}

可以配置session的最大存活时间 和 在redis里存储session的空间名称还有

session更新策略,有ON_SAVE、IMMEDIATE,前者是在调用SessionRepository#save(org.springframework.session.Session)时,在response commit前刷新缓存,后者是只要有任何更新就会刷新缓存

然后需要创建一个 LettuceConnectionFactory 

然后 HttpSessionStrategy 默认提供了两种实现:CookieHttpSessionStrategy和HeaderHttpSessionStrategy

因为我们考虑把 session存header读取 所以这里 使用了HeaderHttpSessionStrategy,并修改了默认的头名称x-auth-token 为Token

到此 整合完毕。

你可能感兴趣的:(Java后端)