WebアプリケーションでApacheShiroを使用しています。ログインと認証のチェックはうまく機能しますが、ログアウト/再ログインのメカニズムを実装するのに問題があります。ログアウトはサーブレットで行われます。
private void logout(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
log.debug("do logout");
Subject subject = SecurityUtils.getSubject();
subject.logout();
resp.sendRedirect("end.html");
}
しかし、ログアウトして再ログインすると、次のエラーが発生します。
org.apache.shiro.session.InvalidSessionException: java.lang.IllegalStateException:
getAttribute: Session already invalidated
at org.apache.shiro.web.session.HttpServletSession.removeAttribute(HttpServletSession.java:167)
at org.apache.shiro.session.ProxiedSession.removeAttribute(ProxiedSession.java:135)
at org.apache.shiro.subject.support.DelegatingSubject.clearRunAsIdentities(DelegatingSubject.java:424)
at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:246)
ログインは次の方法で行われます(UIコンポーネントのメソッドでは、UIフレームワークとしてZKを使用します)。
private void tryLogin(UsernamePasswordToken token) {
Subject subject = SecurityUtils.getSubject();
try {
subject.login(token);
...
shiroからのログアウトはセッションを無効にし、再ログインは新しいセッションにアクセスする必要があるため、例外を理解していません。