Struts2 防止重复提交问题(转)

相信都有表单提交的情况, 很多时候不希望出现重复提交原来的数据, 那么如何防止重复提交问题, 下面我是思考和一些参考整理的结果, 先看看其原理:

 

防止重复提交原理: 

首先
,在页面访问的时候server端产生一个标志位,其保存在session中,同时该标志位放到访问的页面的某个元素中(通常为隐藏域); 

其次,在session存在的有效时间内,没有其它操作时其值保持不变,当提交表单到server端时,会判断client端提交过来的标志位和server端的标志位的值是否相等;

最后,判断标志位的值,如果相等,则执行自己期望的操作;如果不相等,则转向指定的页面;


这个原理在我以前在ASP中实现的这个功能是一样的,在JAVA,PHP都适用,只是实现语言不同而已, 在struts2中中只不过别人都是封装成一些标签(client,server两端都做处理)可直接使用罢了,其实完全可以自己重写而不必受制于那些框架,但对开发着要求要明白其原理,程序写法也稍加注意吧;


下面看在JAVA的 struts2 是如何实现 防止重复提交问题 的:

1、使用Struts2的表单标签,其中需要增加token标签。如下:

 

[java]  view plain copy
  1. ...  
  2. <%@ taglib uri="/struts-tags" prefix="s" %>   
  3. <!-- 注意:要确保jsp中能使用struts2标签,在web.xml中定义的过滤类型为任意,即/* -->  
  4. ...  
  5. <s:form action="goURL" name="form1">   
  6. ...  
  7. <s:token/>   
  8. <s:reset/><s:submit/>   
  9. </s:form>   

2、 在struts配置文件中增加token拦截器。 (token 和 token-session 拦截器的启用,是在 struts.xml 配置文件中,既可以为包启用,也可以单独为某个 action 启用) 

 

2.1  在 Action 中启用 token ,该拦截器仅为本 action 使用,

 

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <!DOCTYPE struts PUBLIC   
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">   
  5. <struts>   
  6. <package name="myGC" extends="struts-default">   
  7. <action name="goURL" class="com.gc.actions.goURLAction" method="execute">   
  8. <interceptor-ref name="defaultStack"/>   
  9. <interceptor-ref name="token"/>   
  10. <result name="success">/success.jsp</result>   
  11. <result name="invalid.token">/inputPage.jsp</result>   
  12. </action>   
  13. </package>   
  14. </struts>   

2.2 在包中启用 token , 该拦截器可为该包内所有的 action 元素使用;
注意,需要name为invaid.token的result。这是当拦截器判断是重复提交的时候,会转向的视图页面。

 

 

[html]  view plain copy
  1. <package name="myGC" extends="struts-default">   
  2.   <interceptors>   
  3.       <interceptor-stack name="myStack">     
  4.       <interceptor-ref name="token"/>     
  5.       <interceptor-ref name="defaultStack"/>          
  6.       </interceptor-stack>    
  7.   </interceptors>   
  8.   <default-interceptor-ref name="myStack"/>     
  9.   <action name="goURL" class="com.gc.actions.goURLAction">   
  10.     <result name="success">/success.jsp</result>   
  11.     <result name="invalid.token">/inputPage.jsp</result>   
  12.   </action>   
  13. </package>   

3、invaid.token页面打印错误信息,一样可以使用struts标签。如下: 

 

 

[html]  view plain copy
  1. <s:actionerror/>  

 

注意:   如果在session失效时间外再提交页面,同样出现不相等的情况,因而转到 invaid.token 指定的视图页面中去;

 

总结: 
1、JSP使用< s:token/ >标签的时候,Struts2会建立一个UUID(全局唯一的字符串)放在session中,并且会成为一个hidden放在form中。 


2、token拦截器会判断客户端form提交的token值和session中保存的值是否equals。如果equals则执行Action。否则拦截器直接返回invaid.token结果转向对应的视图,Action对应的方法也不会执行; 


3、当指定了别的拦截器时,如本例的token,仅仅完成某项功能,后面同时需要指定默认的拦截器,因struts2需要用到,需要注意的是,当没有指定任何拦截器时,默认是隐式启用默认的拦截器的;


Struts2防止表单重复提交 造成重复提交主要的两个原因: 1) 一是,服务器处理时间久。当用户在表单中填完信息,点击“提交”按钮后,由于服务器反应时间过长没能及时看到响应信息,或者出于其它目的,再次点击“提交”按钮,从而导致在服务器端接收到两条或多条相同的信息。如果信息需要存储到后台数据库中,如此以来就会产生数据库操作异常提示信息,以至于给用户带来错误信息提示,从而给用户的使用带来不便。 2) 二是,forward跳转引起的重复提交。当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。当然你可以选择redirect方式跳转页面,这样就不会出现重复提交的问题;但有时为了达到某种效果或式。者出于网站安全的目的需要隐藏网页跳转,而不得不采用forward跳转方 立即下载

相关推荐

struts2利用token防止表单重复提交(源代码)

struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台输出效果

go学习 --- web生成token避免重复提交

一、token避免反复提交 package main import ( "crypto/md5" "fmt" "html/template" "io" "net/http" "strconv" "time" ) func login(w http.ResponseWriter, r *http.Request) { //获取请求方法 fmt.Println("method:",r.Method) //判断是否是get请求方法 if r.Method == "GET" {

qq_46093575的博客 611

Go实现防止多次提交表单

func login(w http.ResponseWriter,r *http.Request){ if r.Method==GEt{//登录界面 crutime:=time.Now().Unix()//获取当前时间戳 h:=md5.New()//获取md5哈希接口 io.WriteString(h,strconv.FormatInt(crutime,10))//写入h中 token:=fmt.Sprintf(%x,h.Sum(nil))//获取哈希结果 t,_=template.ParseFiles(login.gtpl)//解析模板 t.Execut

[Go实战]go写一个简单的内存容器 解决表单重复提交等重复问题

package main import ( "fmt" "time" ) func main() { t1 := newMemory("dongtech") t1.Put("haha") t1.Put("lala") t1.Put("haha") t1.Get() t1.Length() time.Sleep(time.Second * 4) fmt.Println(ti...

学生董格 1823

活用QueryWrapper与@Select注解,构建MybatisPlus动态多表查询方案

本文深入探讨了如何结合MybatisPlus的QueryWrapper与@Select注解,构建高效灵活的动态多表关联查询方案。通过解析${ew.customSqlSegment}占位符机制,并设计通用的Service层封装,解决了复杂条件下多表查询的SQL拼接难题,显著提升了后台管理系统列表查询的开发效率与可维护性。

weixin_29291069的博客 271

GBDT算法详解

本文详细介绍了GBDT算法的原理和特点,并展示了其在回归和分类任务中的应用。首先介绍了GBDT算法的基本思想和公式,然后展示了如何在回归数据集使用GBDT进行回归任务,以及如何在分类数据集上使用GBDT进行文本分类任务。

甜盐的博客 2541

golang处理表单的输入+非空判断+防止表单重复提交

package main import ( "fmt" "html/template" "log" "net/http" _ "strings" ) func login(w http.ResponseWriter, r *http.Request) { r.ParseForm() fmt.Println("method:", r.Method) //获取请求的方法 if r.

源码好优多 2304

VS2022 中 std::mutex 静态初始化陷阱:一次诡异崩溃的排查记录

VS2022中使用std::mutex时遇到的静态初始化陷阱问题。该问题源于VS2022 17.4版本为std::mutex添加constexpr支持后,全局静态初始化可能导致系统资源未就绪时锁失效或崩溃。文章分析了问题现象、影响范围,并提供了解决方案。最后给出了排查清单和核心建议

qq_34552942的博客 953

Struts2 防止重复提交问题

相信都有表单提交的情况, 很多时候不希望出现重复提交原来的数据, 那么如何防止重复提交问题, 下面我是思考和一些参考整理的结果, 先看看其原理: 防止重复提交原理:  首先,在页面访问的时候server端产生一个标志位,其保存在session中,同时该标志位放到访问的页面的某个元素中(通常为隐藏域);  其次,在session存在的有效时间内,没有其它操作时其值保持不变,当提

shenzhenNBA的专栏 1万+

数字经济新质生产力数字化转型数据要素流通交易解决方案:数据要素化演进路径与管理、公共数据授权运营平台体系、数据底座、典型应用场景

数字经济的发展依赖于数据要素的有效流通与交易,数字化转型的核心在于数据的全生命周期管理和价值释放。数据要素化通过数据资源化、资产化和资本化的“三化”过程,实现其经济与社会价值。数据管理涵盖采集、存储、加工、分析等环节,支持数据的度量与交换。公共数据、企业数据和个人数据通过场内、场外及二级市场交易实现资本化。公共数据开发利用面临隐私泄露、监督管理难等痛点,目标是构建授权运营平台体系,确保数据流通的安全与效率。平台体系包括统一门户、授权管理、运营管理、合规监督等核心功能,支持明文、密文和可信交换流通方式。数据底

weixin_44094929的博客 1004

AD7768与STM32F439的硬件设计避坑指南:如何优化高精度ADC系统的电源与PCB布局

本文详细解析了AD7768与STM32F439在高精度ADC系统硬件设计中的关键问题与优化方案。从电源系统设计、PCB布局到基准电压选型,提供了实用的避坑指南和实测数据,帮助工程师提升系统性能至110dB动态范围。特别强调了SPI信号布线和电源滤波对ADC精度的重要影响。

sugar的博客 741

form表单防止重复提交的N种方法

Form表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: (1)点击提交按钮两次。 (2)点击刷新按钮。 (3)使用浏览器后退按钮重复之前的操作,导致重复提交表单。 (4)使用浏览器历史记录重复提交表单。 (5)浏览器重复的HTTP请求。 (6)用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数...

qq_31459039的博客 6111

Fastgpt本地使用Docker Compose 快速部署

修改文件,并执行再执行d重起容器。具体配置,参考配置详解。可以查看日志,在启动容器后,第一次请求网页,会进行配置文件读取,可以看看有没有读取成功以及有无错误日志。进入 FastGPT 容器,可以通过ls data查看目录下是否成功挂载文件。可通过查看配置文件。可能不生效的原因挂载目录不正确配置文件不正确,日志中会提示invalid json,配置文件需要是标准的 JSON 文件。

洛阳泰山的博客 1634

Struts2学习笔记(十八) 防止表单重复提交

概述 有些时候,我们在想某个网页提交了信息之后,由于某些原因,我们会重复点击提交,或者刷新页面,或者是在提交页面呈现之后点击后退按钮,从而导致这些表单数据被重复提交。在大多数情况下我们是不希望这种情况发生的,我们不可能强迫使用者不这么做,那么我们就只能自己想办法来尽量避免这些情况了。 下面我们来看一个例子: public class HelloServlet extends HttpSe

心静欣 6171

OpenClaw 保姆级 window部署

OpenClaw 保姆级 window部署 养龙虾

cs821984831的博客 299

电子元器件选型与实战应用—01 电阻选型

大家好, 我是记得诚。这是《电子元器件选型与实战应用》专栏的第一篇文章,今天的主角是电阻,在每一个电子产品中,都少不了电阻的身影,其重要性不言而喻。

记得诚 3538

struts2 token拦截器防止表单重复提交

>======================================================< 0.struts2的token是什么? struts2的token是用来防止表达的重复提交而定制的拦截器,token只是这个拦截器的别名而已 token有很多种意思如记号,符号等都可称为token。 防止表单重复提交的实现是通过在表单中添加一个隐藏域然后在这个隐藏域中保存一个记号,这个

zyb243380456的专栏 5645

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Struts2 中使用token标签防止刷新和后退进行重复提交

在Struts2中使用token标签和内置的拦截器,来防止刷新提交和后退提交非常简单方便。 1. 在需要防止重复提交的jsp中,只需添加一个标签 2. 在对应的struts.xml中进行配置token拦截器,如下代码,红色部分 http://struts.apache.

Magister_Feng的专栏 6743

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Struts2防止form表单重复提交

问题?Struts2防止form表单重复提交 原理: 1.struts2环境 2.拦截器: 在struts-default.xml可以找到这两个拦截器 返回结果invalid.token --> /message.jsp           案例: jsp页面: str

Mr_li13的博客 983

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

struts2之防止表单重复提交

struts.xml配置文件 &lt;? xml version = " 1.0 " encoding = " UTF-8

dearbaba_8520的博客 313

Struts2防止重复提交

一般使用<interceptor-ref name="token"></interceptor-ref>或者<interceptor-ref name="tokenSession"></interceptor-ref>拦截器进行处理。我们举个简单的例子: Jsp页面: 1 <body> 2 <s:actionerror/&...

weixin_30888707的博客 142

struts2防止表单重复提交问题

现在想起来这个问题还是挺恶心的,为了不让大家再有同样的痛苦,故写成BLOG来分享。首先介意大家能用AJAX提交就从项目开始用AJAX的方法提交。当然我现在介绍的不是用AJAX方法,我就是用的普通struts2方法,现在看来非常简单,由以下几步组成:一:在将要提交页面上加它的作用是在每次生成页面生成一个唯一的信息令牌,也就是默认的拦截器能识别出来的;二:在struts.xml

JAVA学习专用BLOG 1714

SSH笔记-Struts2的防止表单重复提交

1、表单重复提交定义: (1)在不刷新表单页面的前提下: I、多次点击提交按钮 II、已经提交成功, 按 “回退” 之后, 再点击 “提交按钮” III、在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 “刷新(F5)” (2)解决表单重复提交步骤: I、刷新表单页面, 再提交表单不算重复提交 II、若使用的是 redirect响应类型, 已经...

oyy的博客 1171

Struts中防止任意形式的重复提交

注:这个说的挺全面,考虑到了两种情况,一个是超连接,一个是表单 原文是这里Struts 的 Token 机制可以解决这个问题。 1.   防止通过超链接重复访问 Struts Action 。 如果我们要防止 A 的默认页面 J 中指向 K 的超链接重复提交数据,按照下列步骤即可: a.   如果 J 是从 Struts Action 转发而来,我们要在该 Struts

泡菜 1138
上一篇: 将CAS3.1中 https认证的方式改为http(转)
下一篇: SQL查询当前数据上一条和下一条的记录(转)
tempdowncomputer
博客等级 码龄16年 2粉丝 405原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值