在Struts 2中注销后退/重新加载问题之后

时间:2015-02-22 21:52:00

标签: jsp struts2 logout post-redirect-get

我有一个登录页面(Index.jsp),这里用户输入用户ID和密码。在提交LoginAuthentification.java(操作类)上调用并验证用户,但根据操作类中的结果,它返回JSP。

<action name="login" class="com.struts2.LoginAuthentication"
    method="execute">
    <interceptor-ref name="clear-cache" />
    <result name="manager">/ManagerView.jsp</result>
    <result name="SSE" type="redirectAction">
        <param name="actionName">viewPlan</param>
        <param name="userID">${userID}</param>
    </result>
    <result name="input">/Index.jsp</result>
    <result name="error">/error.jsp</result>
</action>

在这种情况下,它返回ManagerView.jsp。现在在这个JSP中,我添加了logout的超链接。它正在下面

<action name="logout" class="com.struts2.LoginAuthentication"
    method="logout">
    <interceptor-ref name="clear-cache" />
    <result name="success">/Index.jsp</result>
    <result name="error">/error.jsp</result>
</action>

来自行动类的代码

public String logout() {  
    //if (session instanceof org.apache.struts2.dispatcher.SessionMap) {
    session.clear();
    //session.re
    System.out.println("test");
    session.remove("loggedInUser");
   ((org.apache.struts2.dispatcher.SessionMap) session).invalidate();

    //}  
    return "success";
}
注销后

重定向到Index.jsp,现在我点击了后退按钮 它在Chrome中显示"confirm form resubmission"消息,在IE中显示已过期的网页。但是当我重新加载页面时,它会自动登录旧用户。  我添加了

<%                        
  response.setHeader("Cache-control", "no-cache, no-store");           
  response.setHeader("Expires", "0");
  response.setHeader("Vary", "*");
%> 

在JSP和拦截器中。

我试图在重新加载时阻止自动登录。

2 个答案:

答案 0 :(得分:0)

问题是,在注销后,您实际上并未重定向到新操作。当你按下后退按钮时,你在浏览器中得到了一个构造对话框,这种行为的原因。后退按钮不用于调用操作,除非它不是通过使用Ajax触发它来调用的。在请求注销时,您应该遵循post-redirect-get模式。

<action name="logout" class="com.struts2.LoginAuthentication" method="logout">
    <interceptor-ref name="clear-cache" />
    <result name="success" type="redirect">/</result>
    <result name="error">/error.jsp</result>
</action> 

答案 1 :(得分:0)

我通过将问题重定向到另一个操作来解决了这个问题。并编写了另一个拦截器来验证它是否在会话中拥有用户ID。

<default-interceptor-ref name="loginStack"></default-interceptor-ref>
<action name="login" class="com.struts2.LoginAuthentication"
            method="execute">
            <interceptor-ref name="defaultStack"/>
            <result name="manager" type="redirectAction">
            <param name="actionName">home</param>
            </result>
</action>
<action name="home" class="com.struts2.LoginAuthentication"
            method="home">
            <result name="success">/ManagerView.jsp</result>
            <result name="error">/error.jsp</result>
        </action>