更新:この問題は、使用していた特定のSpringバージョンに関連していると予想していましたが、Robの回答は、おそらく私の環境に固有のものであることを示しています。この特定の問題(ログイン時にセッションを手動でクリアするフィルター)の回避策を見つけたので、Robの回答を正解としてマークしました。
私のSpringアプリケーションでは、ログイン間でセッションが保持されています。ログイン時にセッションをクリアしたいのですが。
Spring Security 2.0.4を使用しています(質問しないでください)。セキュリティ構成は次のようになります。
<security:http ...
session-fixation-protection="newSession">
...
<security:logout invalidate-session="true" logout-success-url="/login.html" />
</security:http>
私は、 session-fixation-protection="newSession"がユーザーログイン時にセッションをクリアするという印象を受けました。もう1つの興味深い点は、ログアウト時にセッションがクリアされるため、invalidate-session="true"が望ましい効果をもたらすことです。
テストするときは、次の方法を使用します。
@RequestMapping(value = "writeSession")
String writeSession(HttpServletRequest request) {
request.getSession().setAttribute("username", MySecurityService.getLoggedInUsername());
...
}
@RequestMapping(value = "readSession")
String readSession(HttpServletRequest request) {
log.info("Current username: " + request.getSession().getAttribute("username");
...
}
その後私は:
- user1としてログイン
- writeSessionにアクセスします(セッションのユーザー名を「user1」に設定します)
- readSessionにアクセスします(ログ出力:現在のユーザー名:user1)
- user2としてログイン(ログアウトせずに)
- readSessionにアクセスします(ログ出力:現在のユーザー名:user1)
手順3と4の間にログアウトすると、期待どおりの結果が得られることに注意してください(現在のユーザー名:null)