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

token 避免重复提交

阅读更多
<s:token/> 生成如下的内容:(struts.token.name 标识哪个隐藏域存了 token 值)
         <input type="hidden" name="struts.token.name" value="struts.token"/>
        <input type="hidden" name="struts.token" value="7GXL55LPSGU19SDC9D3VP54I20XT3BVA"/>
 
注意自定义的表单域别重名了。它的作用是防止表单重复提交,每次加载页面 struts.token 的值都不一样,如果两次提交时该值一样,则认为是重复提交。此时要启用 TokenInterceptor(token) 拦截器,最好是也启用 TokenSessionStoreInterceptor(token-session) 拦截器,不然后台会出现错误提示:

2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'struts.token' with value '[Ljava.lang.String;@1c2e163'
2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor setParameters
严重: ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression 'struts.token.name' with value '[Ljava.lang.String;@abaf8c'

但不影响使用。不过如果只有 token-session 拦截器却是不行的。

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

1) 为包启用 token 和 token-session

   1. <package name="TestStruts" extends="struts-default">
   2.     <interceptors>
   3.     <interceptor-stack name="myStack">
   4.         <interceptor-ref name="token"/>
   5.         <interceptor-ref name="token-session"/>
   6.     <interceptor-ref name="defaultStack" />             
   7.     </interceptor-stack>
   8.     </interceptors>
   9.     <default-interceptor-ref name="myStack" />
  10.     <action name="Login" class="com.unmi.struts2.action.LoginAction">
  11.         <result name="input">/login.jsp</result>
  12.         <result name="invalid.token">/exception.jsp</result>
  13.     </action>
  14. ............................................................................

<package name="TestStruts" extends="struts-default"> <interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="token"/> <interceptor-ref name="token-session"/> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack" /> <action name="Login" class="com.unmi.struts2.action.LoginAction"> <result name="input">/login.jsp</result> <result name="invalid.token">/exception.jsp</result> </action> ............................................................................
2) 为 Action 启用 token 和 token-session

   1. <action name="Login" class="com.unmi.struts2.action.LoginAction">
   2.     <interceptor-ref name="token" />
   3.     <interceptor-ref name="token-session" />
   4.     <interceptor-ref name="defaultStack" />
   5.     <result name="input">/login.jsp</result>
   6.     <result name="invalid.token">/exception.jsp</result> 
   7. </action>

<action name="Login" class="com.unmi.struts2.action.LoginAction"> <interceptor-ref name="token" /> <interceptor-ref name="token-session" /> <interceptor-ref name="defaultStack" /> <result name="input">/login.jsp</result> <result name="invalid.token">/exception.jsp</result> </action>
注意
1.token、token-session 和 defaultStack 的顺序要保证,
2.还需要加上名为 "invalid.token" 的 result,当发现重复提交时转向到这个逻辑页,/exception.jsp,
3.在 /exception.jsp 加上 <s:actionerror />在出现重复提交时就会提示:
   The form has already been processed or no token was supplied, please try again.
分享到:
评论

相关推荐

    利用Token机制解决重复重复提交

    - 完成对表单数据的处理后,调用`resetToken()`方法清除`HttpSession`中的Token值,避免重复提交。 #### 四、非Struts框架下的Token机制实现 对于非Struts框架的应用程序,也可以采用类似的Token机制来防止表单...

    sturts2防止表单的重复提交 token

    4. **销毁Token**:无论表单处理成功还是失败,服务器都会从session中移除该Token,以防止后续的重复提交。 在实际应用中,我们可以通过Struts2的拦截器(Interceptor)实现这个机制。`...

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

    本文将详细介绍如何在Struts框架中利用Token机制来避免重复提交问题。 #### 一、什么是重复提交问题? 重复提交问题通常发生在用户点击“提交”按钮后网络延迟导致页面加载缓慢的情况下,用户可能会多次点击提交...

    利用struts的token控制重复提交

    1. **生成Token**: 当用户访问一个需要防重复提交的表单时,服务器会生成一个唯一的Token并将其存储在服务器端(比如Session)和客户端(通常隐藏在表单中)。 2. **提交表单**: 用户填写表单并点击提交按钮,这个...

    struts1.2之token解决重复提交

    如果不匹配或Session中不存在该Token,说明可能是重复提交,服务器可以直接忽略此次请求,或者返回一个提示告知用户。 4. 清理Token 一旦处理完请求,应从Session中移除Token,避免后续的误匹配。同时,也可以在...

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

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

    token-springMVC 防止重复提交

    6. **最佳实践**:在实际开发中,通常会结合前端控制(如JavaScript禁用提交按钮)和后端控制(如Token机制)双重保险,以最大程度地减少重复提交的风险。 7. **注意事项**:为了防止Session劫持或令牌被盗用,应...

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

    为了避免这种情况的发生,Struts框架提供了内置的Token机制来防止重复提交。 #### 一、Token机制原理 Token机制是一种常见的防止重复提交的方法,其核心思想是为每一次表单提交生成一个唯一的Token值,并将这个...

    JavaEE Struts2利用tokenSession防止重复提交

    例如,当用户在长时间未操作后再次提交表单,可能需要清除旧的token,避免误报重复提交。此外,对于并发请求,需要确保并发处理的安全性,防止因并发导致的重复提交。 总结,Struts2的tokenSession机制是JavaEE Web...

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

    这样,即使用户再次提交表单,由于Session中的Token已被删除,验证将会失败,从而避免了重复提交。 5. **错误处理**: 如果验证失败,服务器可以返回一个错误提示,告知用户请求可能已处理,无需再次提交。 在...

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

    在Struts配置文件中,为需要防止重复提交的Action添加一个拦截器引用,如`token`或`token-session`。这两个拦截器都可以处理Token,但`token-session`更安全,因为它会将Token存储在会话中,而不仅仅是请求中。 2....

    修改禁止多次重复提交

    在IT行业中,尤其是在Web开发领域,防止用户多次重复提交数据是一项重要的任务,这可以避免数据库出现冗余数据,保持系统稳定。"修改禁止多次重复提交"这个话题涉及到前端交互、后端处理以及数据库操作等多个层面。...

    j2ee服务器端避免重复提交

    下面将详细介绍如何在J2EE服务器端避免重复提交。 1. **事务管理**: J2EE服务器通常支持事务管理,通过在业务逻辑层(EJB或Spring Bean)中使用事务边界,可以确保一次只有一个提交操作被执行。例如,使用Java ...

    Token解决冲突提交

    在Web开发中,Token通常指的是一个唯一的标识符,用于验证用户的身份、防止重复提交或者处理并发问题。在"冲突提交"的情况下,多个用户可能同时尝试修改同一份数据,如果没有适当的机制来处理,可能会导致数据不一致...

    asp.net 页面防止重复提交

    一种防止重复提交的方法是使用“请求令牌”(Request Token)。在页面加载时,服务器生成一个唯一的令牌,并将其存储在隐藏表单字段或Cookie中。在用户提交表单时,服务器会检查令牌是否有效且未使用过。如果令牌已...

    Struts 之旅 - 重复提交 token

    在 Struts 中,"重复提交 token" 是一个重要的概念,用于防止用户意外或恶意地多次提交同一个表单,从而确保数据的一致性和安全性。 在 Web 应用中,重复提交问题可能出现在用户网络不稳定或误操作的情况下,导致同...

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

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

    防止页面重复提交demo

    本示例"防止页面重复提交demo"将介绍一种结合前端控制与后台session存储随机token的方法来解决这个问题。 首先,我们要理解页面重复提交可能产生的原因。通常,用户在点击提交按钮后,由于网络延迟或刷新页面,可能...

    自定义注解解决API接口幂等设计防止表单重复提交(生成token存放到redis中)

    为了解决这一问题,我们可以采用自定义注解结合Redis来实现一个防止表单重复提交的解决方案。 首先,让我们理解自定义注解的核心思想。注解是一种元数据,它提供了在代码中添加信息的方式,这些信息可以被编译器或...

Global site tag (gtag.js) - Google Analytics