public String logout(){
ServletActionContext.getSession().invalidate();
return "login";
}重定向到登陆页面,这中间会经过一个登陆验证过滤器,此时session.getAttribute()时抛出IllegalStateException.
网上有人说不要用invalidate而用session.removeAttribute(),但是我这里必须要保证退出时销毁当前session。
照例说invalidate之后再getSession已经是获取新的session了。这在Action里做没问题,但是在过滤器中执行就报错了。

解决方案 »

  1.   

    抛异常的代码稍作修改    HttpSession session = request.getSession(true);
        if (session.isNew()) {       //session无效,在这里进行页面跳转,返回到登录页面    }
      

  2.   

    我自己解决了,原来是用的Struts2的Action,返回String的结果类型后跳转会报错,现在改成public String logout(){
    session.invalidate();
    response.sendRedirect(request.getContextPath()+"/login.action");
    return null;
    }这样就不会报错了,貌似如果return一个结果后,通过Struts2自身的过滤器会报错。
      

  3.   


    也可以返回一个"logout"字符串 根据返回的字符串跳转到登录页面
    <result name="logout">/login.jsp</result>
      

  4.   

    我的login.jsp是放到web-inf下面的。而且这里我要用redirect,不是dispatcher。反正如果返回"logout"让struts2处理就报错了,必须自己手动response.sendRedirect,很奇怪。
      

  5.   

    return null了,过滤器也就断了。不会再执行。解决的挺好