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 |