java.lang.IllegalStateException:getAttributeNames:会话已经失效

时间:2012-05-16 12:05:52

标签: java struts

获取错误:

java.lang.IllegalStateException: getAttributeNames: Session already invalidated.After logout from parent window.

LogOutUserAction.java

public String execute() throws Exception { 
          System.out.println("inside :: LogOutUserAction------");
         //HttpServletRequest request = null;
          HttpServletRequest request = ServletActionContext.getRequest();
         HttpSession session =request.getSession(true);
         session.removeAttribute("loggedInUser");
        request.getSession(false).invalidate();  
      session=null;  
      return "logout";
      }

LoginInterceptor

public String intercept(ActionInvocation invocation) throws Exception {

        final ActionContext context = invocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) context
                .get(HTTP_REQUEST);     

        HttpServletResponse response = (HttpServletResponse) context
        .get(HTTP_RESPONSE);

        HttpSession session = request.getSession(true);
        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);
       /*user logged out from the parent window then set the message
        for click on the popup window*/
        if(session == null){
            System.out.println("set the attribute");
               request.setAttribute("SessionExpired","Your have already logged out");   
             }  

        Object user = session.getAttribute(USER_HANDLE);
        String loginOut = request.getParameter(LOGIN_OUT);  
        System.out.println("loginOut---->"+loginOut);
        if (user == null) {
            // The user has not logged in yet.
            System.out.println(" inside if ");
            // Is the user attempting to log in right now?
            String loginAttempt = request.getParameter(LOGIN_ATTEMPT);  
            /* The user is attempting to log in. */
            if (!StringUtils.isBlank(loginAttempt)) {               
                return invocation.invoke();
            }
            return "login";
        } else {            
            return invocation.invoke();
        }




    }

的login.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
  if (request.getAttribute("SessionExpired")!= null)
    {
      System.out.println("After Session invalid");


     }
%>



    <html>
    <head>
    <title>Login</title>
    <sx:head cache="true"/>
    <script type="text/javascript">

    </script>
    <script type="text/javascript" language="javascript" src="js/login.js"></script>
    <style type="text/css">
    .style1 {font-family: Verdana, Arial, Helvetica, sans-serif}
    .style2 {
        color: #000099
    }
    </style>
    </head>
    <body bgcolor="#CODFFD" background="<%request.getContextPath();%>images/watermark_new.jpg">
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <div align="center"><span class="style1">USER LOGIN</span>
        <br>
        <br>
        <br>
        <s:form action="checkUserLogin.action" validate="true" name = "loginForm">    
       <s:hidden name="loginAttempt" value="%{'1'}" />
       <table border="0" cellspacing="1" cellpadding="0" width="350" >
           <tr>
           <td align="center">
                <b>Login ID</b>
           </td>
             <td>
               <table>
                <s:textfield id="id" name="loginId" value=""   />
                </table>
              </td>
         </tr>
         <tr>   
           <td align="center">
                <b>Password</b>
           </td>

            <td> 
              <table>   
                <s:password id="password" name="loginPassword"  value=""  showPassword="true"/>
              </table>
            </td>
        </tr>
        <tr><td colspan="2" align="center"> 
              <table>   
                <s:submit value="Login" onclick = "return getRoleList()"/>
              </table>
            </td>
         </tr>
         <tr>       
            <td colspan="2" align="center">
              <table>  
             <s:a href="changePasswordScreen.action" >Change Password</s:a>
             </table>
            </td>
          </tr>
        </table>
       </s:form>

    </div>
    <br>
    <br>
    <br>


    </body>

    </html>

需要在弹出窗口上显示消息(当我点击任何链接时),就像我从父窗口注销后在登录jsp上提到的那样。

1 个答案:

答案 0 :(得分:1)

拦截器可以在调用Action之前和之后执行代码。你什么时候被援引?我想象发生了什么:

  • 在LogOutUserAction.java中,您使会话无效
  • 然后执行LoginInterceptor.intercept。这会尝试从您失效的会话对象中获取属性,从而获得IllegalStateException。

为什么你的会话无效?您的LoginInterceptor使用USER_HANDLE属性的存在来指示用户是否已登录。我会在LogOutUserAction中删除此属性,但不会使会话无效。