user1387365
user1387365

Reputation: 71

java.lang.IllegalStateException: getAttributeNames: Session already invalidated

Getting error:

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>

Need to display message on popup window (when i click on any link) as i mentioned on my login jsp after logout from parent window.

Upvotes: 0

Views: 8360

Answers (1)

Martin Wilson
Martin Wilson

Reputation: 3386

Interceptors can execute code before and after an Action is invoked. When is yours being invoked? I would imagine what's happening is this:

  • In LogOutUserAction.java you invalidate the session
  • LoginInterceptor.intercept is then executed. This tries to get an attribute from the session object that you invalidated hence the IllegalStateException.

Why are you invalidating the session? Your LoginInterceptor is using the presence of the USER_HANDLE attribute to indicate whether or not the user is logged in. I would remove this attribute in your LogOutUserAction but don't invalidate the session.

Upvotes: 1

Related Questions