0

struts 2 で小さなログイン アプリケーションを作成しようとしています。セッションが正常に作成されています。welcome.jsp で「ログアウト」オプションが指定されています。私の問題は、ログアウト セッション変数が破棄された後ですが、ページがブラウザー キャッシュに保存されていることです。ブラウザーの [戻る] ボタンをクリックすると、welcome.jsp が表示されます。キャッシュのクリアには「ClearCacheInterceptor」を使用しています。どこを間違えているのかわかりません。毎回ブラウザをクリアする代わりに、この問題を克服する方法はありますか? 私のアプローチは正しいですか?私に提案してください。

ログイン.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";
    }



}

ようこそ.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>
4

1 に答える 1

3

これは非常に一般的な問題であり、struts2 やその他のフレームワークではなく、ブラウザのキャッシュの問題に関するものです。

ブラウザの戻るボタンを押すと、リクエストがサーバーに送信されず、ブラウザのキャッシュから提供されるため、同じ問題に直面しています。ログインしていないというエラーが表示されます。

no-cache などの特定のヘッダーを使用できますが、ブラウザーがそれらに従っているかどうかは定かではありません。私の理解によると、この問題の唯一の回避策は、作業にhttps(セキュアブラウジング)を使用し、ヘッダー(no-cache.cache-expiryなど)を使用することです。セキュアモードでアプリケーションを閲覧すると、これらのヘッダーの後にサーバーとブラウザ。

ログアウト時にhttpsプロトコルへのリダイレクトを確認するだけで問題が解決することを確認するために、これがあなたにアイデアを与えようとすることを願っています

于 2011-07-20T10:50:18.160 に答える