Spring BootのセッションストアをRedisにする

Redisのインストール/アップデート

以下、Macの場合。

インストール

brew install redis

アップデート

#sudo xcodebuild -license accept
brew update
brew upgrade redis

redis にパスワードを設定

/usr/local/etc/redis.conf

requirepass example_pass

redis 起動

redis-server /usr/local/etc/redis.conf &

redis 停止

redis-cli shutdown

確認

redis-cli
redis 127.0.0.1:6379> set testkey1 value1
OK
redis 127.0.0.1:6379> get testkey1
"value1"

Spring Bootアプリの変更

Spring BootでWebAPI作成 で作成したアプリに redis に接続する処理を追加していく。

build.gradle の修正

build.gradle

repositories {
    mavenCentral()
    maven {
        url("https://repo.spring.io/libs-release")   /* 追加 */
    }
    /* 古い書き方
    mavenRepo url: [
        "https://repo.spring.io/libs-release",
    ]
    */
}

dependencies {
    .
    .
    compile("org.springframework.boot:spring-boot-starter-data-redis")
    compile("org.springframework.session:spring-session-data-redis")
}

application.properties の修正

application.properties に以下を追記。

# Redis
spring.session.store-type=redis
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=example_pass
spring.redis.database=0
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=1

Configの作成

package com.example.demo.config;

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.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {

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

    // JSONにシリアライズする場合
    //@Bean
    //public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
    //    return new GenericJackson2JsonRedisSerializer();
    //}

    @Bean
    public JedisConnectionFactory connectionFactory() {
    		JedisConnectionFactory factory = new JedisConnectionFactory(); 
        factory.setHostName(redisHost);
        factory.setPort(redisPort);
        factory.	setPassword(redisPassword);
        factory.setUsePool(true);
        return factory;
    } 
}

セッションに格納するBeanを作成

package com.example.demo.config;

import java.io.Serializable;
import org.springframework.stereotype.Component;
import lombok.Data;

@Data
@Component
public class SessionInfo implements Serializable {
	private static final long serialVersionUID = 1L;
	private String userId;
	private String userName;
	private String email;
}

コントローラの作成

package com.example.demo.controller;

import javax.servlet.http.HttpSession;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.config.SessionInfo;

@RestController
@RequestMapping("/session")
public class LoginSampleController {

	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public String login(HttpSession httpSession, @RequestParam("userid") String userId) {
		SessionInfo sessionInfo = new SessionInfo();
		sessionInfo.setUserId(userId);
		httpSession.setAttribute("user", sessionInfo);
		return "login OK";
	}

	@RequestMapping(value = "/info", method = RequestMethod.GET)
	public String getInfo(HttpSession httpSession) {
		SessionInfo sessionInfo = (SessionInfo)httpSession.getAttribute("user");
		if (sessionInfo == null) {
			return "sessionInfo is null";
		}
		return "user is " + sessionInfo.getUserId();
	}

	@RequestMapping(value = "/logout", method = RequestMethod.DELETE)
	public String logout(HttpSession httpSession) {
		httpSession.invalidate();
		return "logout OK";
	}
}

動作確認

Redisをいったんクリアしておく

redis-cli
127.0.0.1:6379> AUTH example_pass
OK
127.0.0.1:6379> flushdb
OK


APIにアクセスして確認

# セッションの状態を確認
curl --cookie-jar cookies.txt --cookie cookies.txt -v http://localhost:8080/session/info

# ログイン
curl --cookie-jar cookies.txt --cookie cookies.txt -v -XPOST --data "userid=user001" http://localhost:8080/session/login

# セッションの状態を確認
curl --cookie-jar cookies.txt --cookie cookies.txt -v http://localhost:8080/session/info

# ログアウト
curl --cookie-jar cookies.txt --cookie cookies.txt -v -XDELETE http://localhost:8080/session/logout

# セッションの状態を確認
curl --cookie-jar cookies.txt --cookie cookies.txt -v http://localhost:8080/session/info

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-11-02 (木) 03:13:23 (2539d)