Проблемы с приложением входа в Struts2 - PullRequest
0 голосов
/ 20 июля 2011

Я пытаюсь написать небольшое приложение для входа в Struts 2. Сессия успешно создана. В welcome.jsp указана опция «выход из системы». При выходе управление будет перенаправлено в Logout.jsp.Моя проблема - после того, как переменные сеанса выхода из системы уничтожены, но страницы хранятся в кеше браузера. Если нажать кнопку «Назад» в браузере, я могу увидеть welcome.jsp.Для очистки кэша используется «ClearCacheInterceptor». Я не понимаю, где я делаю ошибку.Вместо того, чтобы очищать браузер каждый раз, есть ли способ преодолеть эту проблему?Мой подход правильный?Пожалуйста, предложите мне.

Login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib  uri="/struts-tags"  prefix="s"  %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
    <s:form action="login">
        <s:textfield name="myname"></s:textfield>
        <s:submit value="submit"></s:submit>
    </s:form>
</body>
</html> 

Struts.xml

<interceptors>
            <interceptor name="clear-cache"  class="ActionClasses.ClearCacheInterceptor" />
         </interceptors>

        <action name="login" class="ActionClasses.LoginAction" >
           <interceptor-ref name="clear-cache" /> 
           <result name="success">Welcome.jsp</result>
           <result name="error">Login.jsp</result>
        </action>  

        <action name="logout" class="ActionClasses.Logout">
          <interceptor-ref name="clear-cache" /> 
          <result name="success">Logout.jsp</result>
        </action>  

LoginAction.java

package ActionClasses;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;
import com.opensymphony.xwork2.validator.annotations.ValidatorType;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class LoginAction extends ActionSupport implements SessionAware
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String myname;
    private Map<String , Object> s;

    public String execute()throws Exception
    {

            s=ActionContext.getContext().getSession();
            s.put("login", myname);

         return "success";

   }


    public void setMyname(String s)
    {

        myname=s;

    }

    public String getMyname()
    {
        return myname;
    }


    @Override
    public void setSession(Map<String, Object> arg0) {
        // TODO Auto-generated method stub
        s=arg0;
    }
  }

ClearcacheInterceptor.java

package ActionClasses;





import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.StrutsStatics;



import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;



public class ClearCacheInterceptor  extends AbstractInterceptor{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override

    public String intercept(ActionInvocation invocation) throws Exception {

        ActionContext context=(ActionContext)invocation.getInvocationContext();

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

        response.setHeader("Cache-Control", "no-cache");

        response.setHeader("Pragma", "no-cache");

        response.setDateHeader("Expires", 0);

        String result=invocation.invoke();

        System.out.println("check result="+result);

        return result;

    }

}

Logout.java

package ActionClasses;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;


public class Logout extends ActionSupport  {



    public String execute(){

        Map<String,Object> s=ActionContext.getContext().getSession();



        s.remove("login");



        ActionContext.getContext().getSession().clear();



        return "success";
    }



}

Welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:include value="CheckLogin.jsp"></s:include>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
</head>
<body>
<font color="white"></font>
Welcome<s:property value="#session['login']"/>
<s:a href="logout">Logout</s:a>
</body>
</html>

Logout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

log out successful !!


</body>
</html>

CheckLogin.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page language="java" contentType="text/html" import="java.util.*"%>
<html>
  <head>
  <title>Check validate!</title>
  </head>
  <body>
  This is session validation page!

  <s:if test="#session.login != 'Jagan'">
  <jsp:forward page="Login.jsp" />  
  </s:if>
  </body>
</html>

1 Ответ

3 голосов
/ 20 июля 2011

Что ж, это очень распространенная проблема, и это касается проблемы кеша вашего браузера, а не Struts2 или какой-либо другой инфраструктуры вообще.

мы столкнулись с той же проблемой, поскольку при нажатии кнопки «Назад» браузера запрос не отправляется на сервер, а подается из кеша браузера. Вы заметите что-то, только когда попытаетесь выполнить какую-то работу, и это появится сообщение об ошибке, что вы больше не входите в систему.

, хотя вы можете использовать определенные заголовки, такие как no-cache и т. Д., Но они соблюдаются браузером, не уверен. Единственный способ обойти эту проблему, насколько я понимаю, - это использовать https (безопасный просмотр) для своей работы, а затем использовать заголовок (no-cache. cache-expiry и т. д.), поскольку при просмотре приложения в безопасном режиме за этим заголовком следует сервер и браузер.

Я надеюсь, что это попытается дать вам идею, просто проверить перенаправление на протокол https при выходе из системы, и это решит вашу проблему

...