[Java]
Springのsessionをいろいろカスタマイズできるライブラリ。もう、でも本当に面倒くさい。
- Spring-sessionのドキュメント
- Spring Session Rob Winch, Vedran Pavić, Jakub Kubrynski Version 2.0.0.BUILD-SNAPSHOT
Spring Session
- GitHub - spring-projects/spring-session
- Project Page - Spring Session
概要
機能自体はかなり魅力的
- Qiita - Spring-Sessionを使ってみた
- 1.0.0.RELEASE のレビュー
- Qiita - [email protected]の簡単な検証
- 1.2.1.RELEASE のレビュー
問題
Plain Old Java Object VS web.xml
- どうやらSpring SessionはAbstractHttpSessionApplicationInitializerという名前のクラスで、Springの起動部分を書き換える。
その際Cookieの設定をConfigクラスとして引数にもつ。
- この方法はweb.xmlで設定されるクラスと競合する
- 一応解決策は最近出てきているようで、HttpSession XML Guideに設定の仕方が載っている
XMLの意味(RedisHttpSessionConfiguration)
- XMLの置かれる場所の例 src/main/webapp/WEB-INF/spring/session.xml
<!-- (1) --> <context:annotation-config/> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/> <!-- (2) --> <bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
(1) <context:annotation-config/>
- <context:annotation-config/>
- annotation-configの主な仕事はすべてのJava Beans上そしてアプリケーションコンテキストファイル上に既に登録されているもの、もしくはcomponent scanの間に登録されたすべてのアノテーションを有効化することだ。重要な点は、それらが登録されている必要があることだ。
We use the combination of <context:annotation-config/> and RedisHttpSessionConfiguration because Spring Session does not yet provide XML Namespace support (see gh-104). This creates a Spring Bean with the name of springSessionRepositoryFilter that implements Filter. The filter is what is in charge of replacing the HttpSession implementation to be backed by Spring Session. In this instance Spring Session is backed by Redis.
書かれていることがその通りであれば、以下が有効になる
Exposes the SessionRepositoryFilter as a bean named "springSessionRepositoryFilter". In order to use this a single RedisConnectionFactory must be exposed as a Bean.
- 有効になりそうなアノテーション
// @Beanで、beanがアプリケーションに登録される @Bean public RedisMessageListenerContainer redisMessageListenerContainer @Bean public RedisTemplate<Object, Object> sessionRedisTemplate @Bean public RedisOperationsSessionRepository sessionRepository @Bean public InitializingBean enableRedisKeyspaceNotificationsInitializer @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer // @Autowired & @Qualifier ユーザー設定のBeanがあればそっちを使う @Autowired(required = false) public void setConfigureRedisAction(ConfigureRedisAction configureRedisAction)\ @Autowired(required = false) @Qualifier("springSessionDefaultRedisSerializer") public void setDefaultRedisSerializer @Autowired(required = false) @Qualifier("springSessionRedisTaskExecutor") public void setRedisTaskExecutor(Executor redisTaskExecutor) @Autowired(required = false) @Qualifier("springSessionRedisSubscriptionExecutor") public void setRedisSubscriptionExecutor(Executor redisSubscriptionExecutor)
(2) LettuceConnectionFactory
We create a RedisConnectionFactory that connects Spring Session to the Redis Server. We configure the connection to connect to localhost on the default port (6379) For more information on configuring Spring Data Redis, refer to the reference documentation.
XMLの意味(SpringHttpSessionConfiguration)
Cookieの設定を変更するためにSpringHttpSessionConfigurationを設定したい。
- 同様にSpringHttpSessionConfigurationをXML中に設定してみる
<!-- (3) --> <bean class="org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration"/>
- 一方で有効になりそうなアノテーション(もう有効になってる?)
@Configuration public class SpringHttpSessionConfiguration implements ApplicationContextAware ... @Bean public SessionEventHttpSessionListenerAdapter sessionEventHttpSessionListenerAdapter() @Bean public <S extends ExpiringSession> SessionRepositoryFilter<? extends ExpiringSession> springSessionRepositoryFilter // servletContextはわりとどうでもいい @Autowired(required = false) public void setServletContext(ServletContext servletContext) { this.servletContext = servletContext; } // !! これは変更したい !! @Autowired(required = false) public void setCookieSerializer(CookieSerializer cookieSerializer) { this.cookieSerializer = cookieSerializer; } @Autowired(required = false) public void setHttpSessionStrategy(HttpSessionStrategy httpSessionStrategy) { this.httpSessionStrategy = httpSessionStrategy; } @Autowired(required = false) public void setHttpSessionListeners(List<HttpSessionListener> listeners) { this.httpSessionListeners = listeners; }
- このへんの設定についてはすでに先行者がいた(中国語)
まず、デフォルトのCOOKIE名だがXMLの設定のみで変更できる。これは内部でDefaultCookieSerializerが使用されているからだと思う。
cookieName, domainNamePattern など、DefaultCookieSerializerで設定されているクラス変数はだいたい置き換えできそうだ。
<bean class="org.springframework.session.web.http.DefaultCookieSerializer"> <property name="cookieName" value="SYSTEM_SESSION_ID" /> <property name="domainNamePattern" value="^.+?\\.(\\w+\\.[a-z]+)$" /> </bean>