2

こんにちは、私は小さなWebアプリケーションを開発しました。すべての機能が正常に動作していますが、ブラウザの戻るボタンを押すと前のページが表示され、アクションボタンを実行またはクリックすると、そのアクションが呼び出されて実行されます。アクション クラスと struts 構成ファイル

 public class LoginAction extends ActionSupport implements ModelDriven, SessionAware,    ServletRequestAware {

private static final long serialVersionUID = -3197657749784237381L;
@SuppressWarnings("unchecked")
private Map session;
private HttpServletRequest request;
private LoginBean logBean = new LoginBean();

public LoginAction() {
}

public Object getModel() {
    return logBean;
}

public LoginBean getLogBean() {
    return logBean;
}

public void setLogBean(LoginBean logBean) {
    this.logBean = logBean;
}

public Map getSession() {
    return session;
}

public void setSession(Map session) {
    this.session = session;
}

/*  public static Log getLOG() {
    return LOG;
}

public static void setLOG(Log LOG) {
    ActionSupport.LOG = LOG;
}
*/

public void setServletRequest(HttpServletRequest request) {
    this.request = request;
}


public String execute() {
    return SUCCESS;
}

public String verifyLogin() {
    String target = "";
    LoginDB logDB = new LoginDB();
    UserBean ub = new UserBean();
    String ipAddress = request.getRemoteAddr();
    ub = logDB.verifyLogin(logBean.getLoginID(), logBean.getPassword());
    if (ub.getInvalid().equals("1")) {
        if (ub.getActive() != 0) {
            session = ActionContext.getContext().getSession();
            session.put("userBean", ub);
            target = SUCCESS;
        }
        else {
            addActionError("Your status is inactive!!!Please Contact Admin Or Activate Link");
            target = INPUT;
        }
    } 
    else {
        addActionError("Invalid LoginID or Password!");
        target = INPUT;
    }

    return target;
}

@SuppressWarnings("unchecked")
@SkipValidation
public String logOut() {
    //LoginDB loginDB = new LoginDB();
    String status = "";
   // String id = request.getParameter("userID");
    String ipAddress = request.getRemoteAddr();
    //int a = loginDB.logOut(id, ipAddress);
    if (true) {
        session.clear();
        session = null;
        if (session instanceof org.apache.struts2.dispatcher.SessionMap) {
            try {
                ((org.apache.struts2.dispatcher.SessionMap) session).invalidate();
            } catch (IllegalStateException e) {
            }
        }
        status = "success";
    } else {
        addActionError(getText("system.ERROR"));
        status = "error";
    }

    return status;
}

}

私の登録クラス

     public String execute() throws SQLException, ClassNotFoundException {
     Register rt = new Register();
     String status = rt.trailUser(user);
     if (status.equalsIgnoreCase("1")) 
    {
        if(Mail()==1)
        {
            addActionMessage("Congratulation you have success fully singed In check your  mail  to Activate Your Acount!");
            return SUCCESS;
        } 
        else
        {
            addActionError("Sign In Again!");
            return INPUT;
        }

    } 
    else {
        return ERROR;
    }
}

struts.xml

// <struts>
<!-- Configuration for the default package. -->
<constant name="struts.Devmode" value="false"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.custom.i18n.resources" value="ApplicationResources" />
<package name="default" extends="struts-default">
        <action name="users">
        <result>home.jsp </result>
    </action>
    <action name="UserAction" class="com.java.action.RegisterAction">
        <result name="input">/signup.jsp</result>
        <result name="success">/home.jsp</result>
        <result name="error">/error.jsp</result>
    </action>
    <action name="trialregister">
        <result>signup.jsp</result>
    </action>
    <action name="Activate" class="com.java.action.ActivationAction">
        <result name="input">/error.jsp</result>
        <result name="success">/home.jsp</result>
        <result name="error">/test1.jsp</result>
    </action>
    <action name="verifyLogin" class="com.java.action.LoginAction" method="verifyLogin">
        <result name="input">/home.jsp</result>
        <result name="success">/test1.jsp</result>
    </action>

    <action name="logOut" class="com.java.action.LoginAction" method="logOut">
        <interceptor-ref name="clear-cache"></interceptor-ref>
        <result name="error">/error.jsp</result>
        <result name="success">/home.jsp</result>
    </action>

    <action name="Back">
    <result>/home.jsp</result>    
    </action>
</package>
</struts>

ログアウト 後にわかるように、セッション変数をクリアしていますが、ユーザーがクリックして戻ると登録ページが表示され、登録ボタンをクリックすると登録アクションが実行されるので、ログアウト後にアクションが実行されないようにする方法を教えてくださいアクションイベントボタンをクリックしても、ログインページにリダイレクトする必要があります。

4

1 に答える 1

3

あなたがやろうとしていることは、私には正しいように思えます。ブラウザの戻るボタンに関しては、これは S2 に関連するものではありません。ブラウザのキャッシュが原因で、ブラウザが戻るボタンを押すと元に戻るからです。

ブラウザにキャッシュをクリアするように要求し、次のようなヘッダーを設定することはできますが

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.

上記のコードを Interceptor に移動し、ログアウト アクションを設定して、ブラウザがヘッダーに従うように要求できるようにすることができます。上記のコードは、ブラウザーのキャッシュからページをロードする代わりに、サーバー上で実際の HTTP 要求を再起動します。応答に上記のヘッダーを追加して、ブラウザーにページをキャッシュしないように指示します。

戻るボタンを押したときに Action クラスコードが実行されることについては、インターセプターを作成し、ログインしているユーザーのみがそれらのアクションを実行でき、ログインしていないユーザーが最初にログインするように求められるように、そのインターセプターを構成することをお勧めします。

サンプルインターセプター

public class LoginInterceptor implements Interceptor {

public LoginInterceptor() {
}

public void destroy() {

}

public void init() {

}

public String intercept(ActionInvocation actionInvocation) throws Exception {

    final ActionContext context = actionInvocation.getInvocationContext();
    HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
    HttpSession session = request.getSession(true);

    //Code

    try {

        Users user= (Users) session.getAttribute("user");

        if (user== null) {

            return "login";
        }

    } catch (Exception e) {
        Logger.getLogger(LoginInterceptor.class.getName()).log(Level.INFO, "message", e);
    }

    //Invoke action
    String result = actionInvocation.invoke();

    return result;
}
}

このインターセプターは、ユーザーがセッションに存在するかどうかをチェックします。ユーザーが存在しない場合、ログイン ページにリダイレクトされます。それ以外の場合、要求は階層内の次のインターセプターに移動します。

このインターセプターを struts.xml ファイルで構成する

struts.xml

<interceptors>  
       <interceptor class="myclass.LoginInterceptor" name="loginInterceptor">  
                      </interceptor>  
       <interceptor-stack name="loginStack">  
        <interceptor-ref name="loginInterceptor">  
        <interceptor-ref name="defaultStack">  
       </interceptor-ref>  
      </interceptor-ref>  
 </interceptors>
 <default-interceptor-ref name="loginStack">  

構成したら、そのユーザーがログインする必要があるすべてのアクション呼び出しにインターセプターを使用できます。

これを行う方法の詳細については、このチュートリアルを参照してください。

このインターセプター手法は学習目的のみであり、実際のプロジェクトでそのようなユースケースを実装したい場合は、これらのユースケースを処理するための非常に強力で柔軟な方法を提供する Spring-Security のようなセキュリティ フレームワークを使用することをお勧めします。

于 2012-04-05T07:25:29.750 に答える