`

Struts中防止表单重复提交

阅读更多
在Struts中,表单的提交至少涉及两个Struts动作:

第一个负责把表单显示给用户

第二个负责对用户通过表单提交的数据进行处理


我们在第一个表单动作里生成一个Token(标记)并保存在HttpSession对象和表单的Hidden中各保存一份,在第二个动作里,对比Hidden和HttpSession中的值,如果匹配则正常处理,否则,则属于表单重复提交,总体来说思路与验证码类似。
下面是具体实现步骤:

index.jsp


<a href="redirect.do">添加用户</a>RedirectAction.java
public class RedirectAction extends Action {

     

       public ActionForward execute(ActionMapping mapping, ActionForm form,

               HttpServletRequest request, HttpServletResponse response) {

            

              this.saveToken(request);          // 生成Token



        return mapping.findForward("input");

       }

}
input.jsp

<html:form action="user.do">

  userName:<html:text property="userName"/>

  <input type="hidden"

         name="<%=Constants.TOKEN_KEY%>"

         value="<%=session.getAttribute(Globals.TRANSACTION_TOKEN_KEY)%>"/>

  <html:submit value="submit"/>

</html:form>

UserAction.java

public class UserAction extends Action {

     

       public ActionForward execute(ActionMapping mapping, ActionForm form,

                     HttpServletRequest request, HttpServletResponse response) {

              // 验证Token

              if (!this.isTokenValid(request)) {

                     return mapping.findForward("error");

              }

              // 清除Token

              this.resetToken(request);

              UserForm userForm = (UserForm) form;

      

              // (后面代码与防止表单重复提交无关,不再叙述)

              HttpSession session = request.getSession();

        Vector userList = (Vector) session.getAttribute("userList");

        if (userList == null) {

              userList = new Vector();

        }

        userList.add(userForm.getUserName());

        session.setAttribute("userList", userList);

       return mapping.findForward("show");

       }

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics