3

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からのログアウトはセッションを無効にし、再ログインは新しいセッションにアクセスする必要があるため、例外を理解していません。

4

2 に答える 2

3

これは、バージョン1.2より前のShiroで、誰か(または他の何か)Subject.logout()が呼び出される前にセッションを無効にした場合に発生します(たとえばhttpSession.invalidate()、その後subject.logout())。

これはSHIRO-298のバグとして発生し、1.2.0-SNAPSHOTビルドですでに解決されています。現在のスナップショットビルドの1つを使用するか、リリース時にShiro1.2.0を使用できます。

于 2012-01-17T19:14:23.437 に答える
1

UIフレームワークがログアウト後にセッションを再生成していないようです。ログイン呼び出しの直前に、subject.getSession()を呼び出す新しいセッションを強制することができます。このようなもの:

private void tryLogin(UsernamePasswordToken token) {
        Subject subject = SecurityUtils.getSubject();
        Session session = subject.getSession();
        try {
              subject.login(token);
于 2012-01-17T15:27:10.223 に答える