使用Spring Boot 2.x版本,在Docker上使用Redis进行会话管理

使用Spring Boot 2和Spring Session Redis尝试实现会话管理,但根据我查到的资料,它并没有正常工作(或者更准确地说,由于Redis库的版本更新,一些方法已经被标记为过时,需要改变实现方式)。因此,我将它作为备忘录留下来。

环境、版本之类的

    • windows 8.1

 

    • Docker Toolbox for win

 

    Spring Boot 2.0.4.RELEASE

实施

应用程序配置文件

spring.session.store-type=redis
spring.session.redis.flush-mode=on-save # Sessions flush mode.
spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.

应用程序配置文件如下所示。这里没有特别的事情。

pom.xml -> 项目对象模型文件

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

翻译:要用这个样子。虽然只需要声明前两个但我建议还是定义jedis和commons-pool2,否则可能会出现NoClassDefError错误,请注意。

配置类

package com.example.ek.session;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession
public class SpringSessionConfig {

    @Bean
    public JedisConnectionFactory connectionFactory() {
          RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
          redisStandaloneConfiguration.setHostName("192.168.99.100");
          redisStandaloneConfiguration.setPort(6379);
          return new JedisConnectionFactory(redisStandaloneConfiguration);
    }

}

重点是这个类,在进行了各种调查后,原本在JedisConnectionFactory类中已有setHostName、setPort等方法,只需要在那里添加设置并返回即可。但是2.0以上版本已经被标记为过时,在Eclipse中会出现错误提示。因此,在查阅了javadoc后,它提到了”使用RedisStandaloneConfiguration”,所以将其作为参数传递给JedisConnectionFactory的构造函数并返回。

package com.example.ek.session;

import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;

public class HttpSessionApplicationInitializer extends AbstractHttpSessionApplicationInitializer {

    public HttpSessionApplicationInitializer() {
        super(SpringSessionConfig.class); 
    }
}

这里没有什么特别罕见的事情。在构造函数中调用父类,并将config类作为参数设置。

Docker – 道格服务器

我也在Docker中做了一些事情,姑且也记下来吧。

$ docker-machine env --shell default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH=**
export DOCKER_MACHINE_NAME="default"
export DOCKER_COVERT_WINDOWS_PATHS="true"

使用export命令一个一个地设置出现的项目方式如下。

$ export DOCKER_TLS_VERIFY="1" 

只需运行docker。

$ docker container run --name sample-redis -d -p 6379:6379 redis

// omitted

$ docker container ls
CONTAINER ID     IMAGE      COMMAND    CREATED      STATUS       PORTS      NAMES
ce9e74e42aa9      redis      "docker-entrypoint.s"      8 seconds ago      Up 7 seconds      0.0.0.0:6379->6379/tcp      sample-redis

现在准备已经完成了,可以通过控制台进入到redis,并输入redis-cli命令。

$ docker exec -it redis bash
root@ce9e74e42aa9:/data# redis-cli
127.0.0.0:6379>

当键入`keys`命令时,Redis会显示记录的会话信息。首次时,当然会是空的,但是当启动应用程序并登录后,就可以确认会话已经成功地记录在Redis中了。

127.0.0.0:6379> keys *
1) "spring:session:sessions:expires:**********"
2) "spring:session:sessions:********"
3) "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:********"

的实际代码已经放在下方了。

广告
将在 10 秒后关闭
bannerAds