[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交相关的知识,希望对你有一定的参考价值。

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.概述

  1)表单的重复提交

    - 若刷新表单页面, 再提交表单不算重复提交

      - 在不刷新表单页面的前提下: 

      - 多次点击提交按钮

      - 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮".

        - 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)“

重复提交的缺点:

    - 加重了服务器的负担

    - 加重了服务器的负担

 

 

 

技术分享

 

2.Strut2 解决表单的重复提交的方式:

  1)在s:form 中添加 s:token 子标签

      > 生成一个隐藏域

      > 在session 添加一个属性值

      >  隐藏域的值和session 的属性值是一致的

  2)使用Token 或者 TokenSession 拦截器

      > 这两个拦截器均不在默认的拦截器栈中,所以手工配置

      > 若使用Token 拦截器,则需要配置一个Token.valid 的result

      > 若使用TokenSession 拦截器,则不需要配置任何其他的result

  3)Token  vs TokenSession

       > 都是解决表单重复提交的问题

       > 使用Token 拦截器转到 token.valid 这个 result

       > 使用tokenSession 拦截器,则还会响应那个目标页面,但,不会执行目标action 的方法。就像什么都没发生过一样。

  4)可以使用s:actionerror 标签来显示重复提交表单的错误消息,该错误消息可以在国际化资源文件中被覆盖。该消息可以在 struts-messages.properties 文件中找到

      struts.message.invalid.token  = 自定义提示内容

token.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib prefix="s" uri="/struts-tags" %>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11     
12     <s:form action="testToken" >
13         <s:token></s:token>
14         <s:textfield name="userName" label="UserName"></s:textfield>
15         
16         <s:submit></s:submit>
17     </s:form>
18 
19 
20 </body>
21 </html>

 

 

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="default" namespace="/" extends="struts-default">

<action name="testToken" class="com.jason.upload.app.TokenAction">
<!-- <interceptor-ref name="tokenSession"></interceptor-ref> -->

<interceptor-ref name="token"></interceptor-ref>

<interceptor-ref name="defaultStack"></interceptor-ref> <result>/success.jsp</result>

<result name="invalid.token">/token-error.jsp</result> </action> </package> </struts>

 

 

 

TokenAction.java

 1 package com.jason.upload.app;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 public class TokenAction extends ActionSupport {
 6 
 7     /**
 8      * @Fields:serialVersionUID
 9      */
10     private static final long serialVersionUID = 1L;
11 
12     private String userName;
13 
14     public String getUserName() {
15         return userName;
16     }
17 
18     public void setUserName(String userName) {
19         this.userName = userName;
20     }
21 
22     @Override
23     public String execute() throws Exception {
24         
25         Thread.sleep(2000);
26         System.out.println(userName);
27         return SUCCESS;
28     }
29 
30 }

 

 

 

 

 

 

 

 

 

 

 

  

以上是关于[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交的主要内容,如果未能解决你的问题,请参考以下文章

[原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

[原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,Prepar

[原创]java WEB学习笔记70:Struts2 学习之路-- 输入验证,声明式验证,声明是验证原理

[原创]java WEB学习笔记64:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) ModelDriven拦截器 paramter 拦截器