Struts 1.X重複コミットの解決



フォームの記入が完了するたびに「発行」をクリックすると、strutsでactionが関連するビジネスロジックを実行し、forwardオブジェクトを介してページに移動します.このときページをリフレッシュすると、同じ論理が実行されます.たとえば、データベースにデータを記録すると、上記の場合、データベースに同じデータが2つあります.このような状況を避けるために、いくつかの解決策があります.
1:ビジネスロジックを実行した後、Forwardオブジェクトを返します.このforwardオブジェクトのpathプロパティは、べき乗などのXXX.do操作を構成する必要があります.これにより解決できますが、ユーザーの要求に合わない可能性があります.他の方法があります.
2:リダイレクト、プロファイル内でredirectプロパティを構成し、xxx.jspにリダイレクトします.この場合request範囲内のパラメータが失われ、xxx.jspがこれらのパラメータを要求しなければ、操作したデータがsession範囲内に保存されていれば、全体の効果に影響しません.しかし、やはり弊害がある.
3:struts 1.xトークンを使用すると、このような問題をうまく解決できます.
必要条件:フォーム内でstrutsのライブラリラベル(次の例を示します.
LoginAction:
 package com.web.action;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.apache.struts.action.ActionForm;
 import org.apache.struts.action.ActionForward;
 import org.apache.struts.action.ActionMapping;
 import org.apache.struts.actions.DispatchAction;
 public class LoginAction extends DispatchAction  {
    public ActionForward get(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
           throws Exception  {
       //    (   jsp     32 jsessionid)\
        this.saveToken(request);
        System.out.println("begin save");
        return mapping.findForward("login");
    }
    
    public ActionForward login(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception  {
        /**//*if(this.isTokenValid(request))
        {
            System.out.println("valid");
            this.resetToken(request);
            return mapping.findForward("ok");
        }*/
        //               
        if(this.isTokenValid(request,true))
         {
            System.out.println("valid");
            return mapping.findForward("ok");
        }
        else
        {
            System.out.println("invalid");
            return mapping.findForward("error");
        }
    }
}
struts-config.xml:
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
 <struts-config>
     <data-sources />
     <form-beans>
         <form-bean name="loginForm" type="com.web.form.LoginForm"></form-bean>
     </form-beans>
     <global-exceptions />
     <global-forwards />
     <action-mappings>
         <action path="/login" parameter="method" name="loginForm"
             type="com.web.action.LoginAction">
             <forward name="login" path="/login.jsp" />
             <forward name="ok" path="/ok.jsp" />
             <forward name="error" path="/error.jsp" />
         </action>
     </action-mappings>
     <message-resources parameter="" />
 </struts-config>
index.jsp:
<% @page contentType="text/html; charset=GBK"%>
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 <c:set var="ctx" value="${pageContext.request.contextPath}" />
 <html>
   <head>
     <title>My Jsp</title>
   </head>
   <body>
   <a href="${ctx}/login.do?method=get">  </a>
   </body>
 </html>
 

login.jsp:
<% @page contentType="text/html; charset=GBK"%>
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<% @taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
 <html>
   <head>
     <title>My Jsp</title>
   </head>
   <body>
   <c:set var="ctx" value="${pageContext.request.contextPath}"/>
   <!--       html  ,  token    -->
   <html:form action="login.do?method=login" method="post">
     <html:submit value="  "></html:submit>
   </html:form>
   </body>
 </html>
          ,    "  ".
      login.jsp       :
 <html>
   <head>
     <title>My Jsp</title>
   </head>
   <body>
   
   <form name="loginForm" method="post" action="/strutsToken/login.do?method=login">
 <div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
     <input type="submit" value="  ">
   </form>
   </body>
 </html>
 
        login.jsp       :
 <div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
       32     JsessionID   .
 LoginAction  get   saveToken(request)    .
          jsessionid   request   .

         :
 if(this.isTokenValid(request,true))
         {
            System.out.println("valid");
            return mapping.findForward("ok");
        }
 ,   login.jsp     jsessionid request 
    ,    ,     .                 
   .        .
     ,            jsessionid(       ),
        ,    ,     .
              . 
          ,     action   :     ,       ,add() insert(), add            ,      insert   ,    。