Spring Boot 2系にてRedis（on Docker）を使ってセッション管理する

Spring Boot 2系とSpring Session Redisを使ってセッション管理を実装してみたが、  調べた内容では上手く動作しなかった（というかRedisの方がライブラリのバージョンアップに伴い、_Duprecated_ となっていたメソッドがあり実装を変える必要があった）ので備忘として残しておく。

### 環境とかバージョンとか
* windows 8.1
* Docker Toolbox for win
* Spring Boot 2.0.4.RELEASE

### 実装
#### application.properties
```sh
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.
```

application.propertiesはこんな感じ。ここは特別なことは特にない。  

#### pom.xml
```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>

```

pomはこんな感じ。ってきり、上2つだけ宣言すればよいと思っていただが、```jedis```と```commons-pool2```も定義しておかないと```NoClassDefError```が出てしまうので注意。


#### Configクラス

```java
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```等のメソッドがあって、そこに設定を追加してreturnすれば良かったようなのですが、2.0以上は _Deprecated_ になってしまっていてEclipseに怒られる。で、javadoc見ると『 ```RedisStandaloneConfiguration``` を使え』と記載があったので、 ```JedisConnectionFactory```のコンストラクタに引数として渡してreturnする。


```java
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でやったことも記載しておく。

```sh
$ 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コマンドで1つ1つ設定していく。  

```sh
$ export DOCKER_TLS_VERIFY="1" 
```

あとは```docker run```するだけ。  

```sh
$ 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
```

これで準備OKなので、redisにコンソールで入り、```redis-cli```と打つ

```sh
$ docker exec -it redis bash
root@ce9e74e42aa9:/data# redis-cli
127.0.0.0:6379>
```
```keys * ```コマンドを打つとRedisに記録されているセッション情報が表示される。最初はモチロン空だが、アプリを起動→ログインすると、無事Redisにセッションが記録されていることがわかる。

```sh
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:********"
```

実際のソースコードは以下に載せています。
[ソースコード](https://github.com/E-Kanegae/SpringBoot2Sample)