ある一定の条件をDBから取得して、条件に一致するならば指定された画面にリダイレクトするような画面が作りたいとする。
そんなとき、Spring-securityを使っているならばカスタムフィルターが使える。フィルターを定義して、そのクラスの中でリダイレクトを実行させればよい。
Spring-securityで定義されるフィルターの種類
Spring-securityでフィルターを差し込めるタイミングは以下の一覧に載っている。
使いそうなもの
- CSRF_FILTER
- LOGOUT_FILTER
- FORM_LOGIN_FILTER
- FILTER_SECURITY_INTERCEPTOR
カスタムで作成したフィルターは、上記の前にも後にも、もしくはそのフィルター自体の代替として定義できる。
<http>
<!-- 前 -->
<custom-filter before="FORM_LOGIN_FILTER" ref="myFilter" />
<!-- それ自体の代わりとして -->
<custom-filter position="FORM_LOGIN_FILTER" ref="myFilter" />
<!-- 後 -->
<custom-filter after="FORM_LOGIN_FILTER" ref="myFilter" />
</http>
フィルター自体の定義方法
Springのフィルターは GenericFilterBean
を使ったほうがいいようだ。プロジェクトの適当なところに、このクラスを継承したクラスを定義する。
そして、そのクラスの名前空間とSpring上でのidをXMLに設定する。そうすることで、spring-securityで使用するためだ。
<beans:bean id="myFilter" class="org.baeldung.security.filter.CustomFilter"/>
二重Dispatchを防ぐために
こういうプロジェクト全体的にかかわるフィルターを書くと、Strutsとかでかつてよく見た二重Dispatchのエラーが出る。こんなの:
java.lang.IllegalStateException: Cannot forward after response has been committed
要は、行き先が決まっているリクエストをフィルターでもう一度リダイレクトしようとするとこれが起こる。
対処としては、前述の Table 6.1. Standard Filter Aliases and Ordering を見て、リクエストの行き先が決まる前に所望のフィルター処理を実行することだ。