有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

StrutsJava。lang.IllegalStateException:GetAttributeName:会话已无效

获取错误:

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

LogOutUserAction。爪哇

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";
      }

登录接收器

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();
        }




    }

登录。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) 个答案

  1. # 1 楼答案

    拦截器可以在调用操作之前和之后执行代码。什么时候调用你的?我可以想象发生的事情是这样的:

    • 在LogOutUserAction中。java是否使会话无效
    • LoginInterceptor。然后执行拦截。这将尝试从会话对象中获取一个属性,该属性已失效,因此出现了IllegalStateException

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