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 |