FreeStyleWiki

Spring Session

このエントリーをはてなブックマークに追加

[Java]

Springのsessionをいろいろカスタマイズできるライブラリ。もう、でも本当に面倒くさい。

Spring-sessionのドキュメント
Spring Session Rob Winch, Vedran Pavić, Jakub Kubrynski Version 2.0.0.BUILD-SNAPSHOT

Spring Session

  概要

機能自体はかなり魅力的

Qiita - Spring-Sessionを使ってみた
1.0.0.RELEASE のレビュー
Qiita - [email protected]の簡単な検証
1.2.1.RELEASE のレビュー

  問題

Plain Old Java Object VS web.xml

その際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>