`
Aubergine_kang
  • 浏览: 264837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2的token阻止表单重复提交(原创)

 
阅读更多

最近完成了阻止struts2重复提交的功能

1.作用:经常的一个表单提交需要一定时间,在等待时间内,服务器正在处理请求,而用户可能会不断点击提交按钮,造成一个订单面的重复提交

2.如何模拟重复提交:一个表单,点击提交按钮后,刷新,会提示:(见附件)

也就是再次提交当前页面。

3.使用技术:struts2token标签

简介:jsp页面读取到<s:token/> 标签时,会在session中设置一个struts.token值,同时将此值在.jsp页面翻译做:(表单中增加两个隐藏字段,struts.token值随机生成)

如我们jsp页面写<s:token name=”mytoken”/>

那么翻译做:

<input type="hidden" value=" mytoken " name="struts.token.name">

<input type="hidden" value="FKZCDK5XC881W05MLVK0JQJP04M0KZC2" name=" mytoken ">

如果写作<s:token/>

则翻译做:

<input type="hidden" value="struts.token" name="struts.token.name">

<input type="hidden" value="FKZCDK5XC881W05MLVK0JQJP04M0KZC2" name="struts.token">

接着~

提交表单到我们指定的Action时先会先经过token拦截器, token拦截器会从form表单中获取token值, 再从session中获取token(注:我们可以在action中设置mytoken属性,String类型的,加getset方法,提交表单的时候就会像表单其他属性一样set值进去,取值出来;同时,我们可以取得httpsession,从里面getAttribute(“mytoken”)出来) 比较两个值是否相同 不相同, 直接返回 invalid.tokeninvalid.token应配置成重复提交表单的提示信息页面)相同,removesession里的 struts.token(防止被重复使用), 继续正常流程

例如,我们进入a.jsp,那么里面就默认有token的隐藏域了,session里也有token值了。我们第一次点击提交,在进入action之前会进去到token拦截器里,token取出页面和session里的token比对,相同的则提交表单。不同的,根据我们设置,比如返回页面,显示提示信息(<s: actionerror/>),跳到错误页面,进入等待页面等。这个看我们struts.xml的配置了。

说一句:无论那种处理,使用struts2token来阻止重复提交修改的就俩地:

一、form表单加<s:token/>(如果是错误信息显示<s: actionerror/>

二、配置文件struts.xml(配置拦截器,配置跳转页面,等待页面)

注:写上一后,session和页面就有token值了。我们在struts2action中可以取到这两处的值~

但是,拦截器不会起作用,也就是说不会阻止表单提交

 

 

本人遇到的不解是:

1、页面解析到<s:token/>时候会将此token放到session中,同时在页面解析做两个hidden。

2、相同的则会提交表单,并移除session里的token(真的吗?),不同则会视为重复提交,阻止提交

 

 

使用firebug发现:第一次提交表单,session里的token和表单里的一样,刷新之后,session里的token变了(但是不是空的),而表单里的值和先前一样没有变(这个和上面说的有悖)

 

 

有个点需要注意:

两个token一样表单才可提交;不一样就视为重复提交了,会被阻止

本人使用的是,如果重复提交,弹出对话框,并终止程序进入action

1.页面

<body onload="show(<s:property value='repeat'/>)">

<form>

<s:token name="mytoken"/>

</form>

</body>

js:if(){alert("stop!repeat");}

2.action  

private String mytoken;(get/set)

private boolean repeat;(get/set)

public void validate() {
  String tokenInSession = (String) httpSession.getAttribute("token");
  if (StringUtils.isNotEmpty(mytoken)
    && StringUtils.isNotEmpty(tokenInSession)) {
   if (!tokenInSession.equals(token)) {
    // no
    repeatFlag = true;
    addFieldError("repeatMsg", "repeat");//这句话没有显示,单纯的告诉calidate验证不通过别执行下面的action了
   }
  }
 }

struts.xml中配置没有改变只是多一个

<result name="input">/view/goods_apply.jsp</result>

注:name="input"在什么时候用呢?

答:在validate验证错误的时候会跳到这个页面~

 

 

 

 

上面写的更多的是我自己总结出来方法和原理,有不对的地方希望大家多指教。想具体学习,可以网搜(struts2阻止重复提交)会有很多很全面的文章

祝大家学习愉快~~~

 

 

 

分享到:
评论

相关推荐

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

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

    struts+token机制解决表单重复提交

    在提供的压缩包文件"struts+token机制解决表单重复提交"中,可能包含了具体的Struts配置文件、Action类、Interceptor实现以及示例代码,可以帮助读者更深入地理解并实践这个机制。通过对这些代码的学习和研究,...

    Struts之Token解决表单那重复提交

    综上所述,Struts框架通过Token机制有效地解决了表单重复提交的问题,提供了更健壮的Web应用安全性。正确理解和应用这一机制对于Java Web开发者来说至关重要。在实际项目中,结合其他防御策略,如CSRF防护,可以...

    struts token机制解决表单重复提交

    Struts Token机制是一种防止表单重复提交的有效策略,尤其在处理关键操作时,如金融交易或数据修改,防止用户意外或恶意多次点击提交按钮导致的数据重复性问题。下面将详细介绍Struts Token的工作原理、实现方式及其...

    Struts2解决表单重复提交

    这样,当发生重复提交时,Struts2框架会自动处理并转向token.jsp页面,提示用户重复提交了表单。 对于第二种原因,即提交表单后刷新浏览器页面导致的重复提交,Struts2框架允许开发者通过配置结果视图的跳转方式来...

    struts2中token限制表单多次提交

    当用户尝试重复提交表单时,Struts2会检测到Token已经使用过,因此会抛出异常。你可以捕获这个异常并给出相应的提示,例如: ```java public class MyAction extends ActionSupport { @Override public void ...

    struts2_token控制刷新重复提交

    3. **验证Token:** 在处理表单提交的Action方法中,Struts2的Token拦截器会自动进行Token验证。如果验证失败(比如因为用户刷新页面),拦截器会抛出一个`TokenException`,你可以捕获这个异常并处理。 ```java ...

    JavaEE Struts2利用tokenSession防止重复提交

    总结,Struts2的tokenSession机制是JavaEE Web开发中防止重复提交的有效手段,通过生成并校验token,确保每个请求的唯一性,从而保护了业务数据的完整性。在实际项目中,我们需要正确配置和使用这个机制,以提高应用...

    用STRUTS的TOKEN机制解决表单重复提交,转载自:百度文库

    Struts的Token机制是Web应用中防止表单重复提交的一种常用方法。在处理表单提交时,如果用户意外地多次点击了提交按钮,可能会导致数据的重复录入,从而引起不必要的问题,例如订单重复、数据库数据异常等。为了解决...

    用Struts的Token机制解决表单重复提交.doc

    ### 使用Struts Token机制解决表单重复提交 #### 一、引言 在Web应用程序开发过程中,表单重复提交是一个常见的问题。用户可能因为网络延迟、浏览器缓存等原因导致重复点击提交按钮,进而向服务器发送多个相同的...

    struts2 防止表单重复提交的例子

    Struts2框架提供了一种解决方案,即使用Token机制来防止表单的重复提交。以下是对这个主题的详细说明: 1. **表单重复提交问题**:当用户在提交表单时,由于网络延迟或用户误操作,可能会导致同一个表单被多次提交...

    利用struts的token控制重复提交

    Struts的Token机制主要用来防止用户意外或恶意的多次提交表单,例如在刷新页面时重复提交数据。它的工作原理如下: 1. **生成Token**: 当用户访问一个需要防重复提交的表单时,服务器会生成一个唯一的Token并将其...

    struts token 防止页面刷新,重复提交

    通过自定义的Token类和方法,我们可以在不依赖Struts内置机制的情况下实现防止表单重复提交的功能。这种方式不仅灵活,而且易于理解和维护。开发者可以根据实际需求调整Token生成、存储和验证的方式,以适应不同的...

    struts2令牌解决页面重复提交问题

    若不匹配或令牌已被使用,Struts2会抛出`TokenException`异常,此时可以捕获这个异常并显示错误信息,阻止重复操作。 5. **清理令牌**:处理完表单请求后,需要调用`clearToken()`方法来清除session中的令牌,以...

    struts2token回退刷新

    Struts2 Token回退刷新是一种防止重复提交的安全机制,尤其在处理并发操作和防止 CSRF(跨站请求伪造)攻击时显得尤为重要。Struts2框架提供了一种令牌验证的方式来确保每个表单提交是唯一的,避免了恶意用户通过...

    struts1.2之token解决重复提交

    总的来说,Struts 1.2的Token机制提供了一种简单但有效的防止重复提交的解决方案。通过理解和实践这一机制,开发者可以更好地保护Web应用程序的数据一致性。同时,深入研究源码有助于加深对Struts工作原理的理解,...

    Struts2防止表单重复提交示例

    Struts2是一个流行的Java ...总结来说,Struts2通过Token机制有效地解决了表单重复提交的问题,提高了Web应用的健壮性。通过合理的配置和拦截器的使用,开发者可以轻松地集成这一功能,确保每个表单请求只被处理一次。

    解决在struts 中可以通过token 来重复提交的问题

    通过以上三个步骤,我们成功地实现了在Struts中通过Token来防止表单重复提交的功能。这种方法不仅提高了应用的安全性,还提升了用户体验。在实际项目开发过程中,还需要根据具体需求进一步完善和优化这一机制。

Global site tag (gtag.js) - Google Analytics