`
chenyubo
  • 浏览: 79756 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Struts中利用同步令牌(Token)解决重复提交的问题

阅读更多
在某些情况下,如果用户对一个HTML表单重复提交,Web应用应该必须能够判断用户的重复提交行为,以做相应的处理。

Struts给出了一个参考实现。org.apache.struts.action.Action类中提供了一系列和Token有关的方法:

1.protected boolean isTokenVali(javax.servlet.http.HttpServletRequest request)
判断存储在当前用户会话中的令牌值和请求参数中的令牌值是否匹配,如果匹配就返回true,否则返回false.

2.protected void resetToken(javax.servlet.http.HttpServletRequest request)
从当前session中删除令牌值。

3. protected void saveToken(javax.servlet.http.HttpServletRequest request)
创建一个新令牌,并把他保存在session范围内。

提示:具体的Token处理逻辑是org.apache.struts.util.TokenProcesor类完成的,大家可以反编译看看这个类的处理逻辑。它的generateToken(request)方法根据用户会话ID和当前的系统时间来生成一个唯一的令牌值。

流程:
比如一个注册流程,在用户请求注册页面之前,是由一个Action转发给到这个注册页面,在这个Action中加入saveToken(request)方法,创建一个Token,并把它保存在session中。然后转发给注册页面。在注册页面的<html:form>标签的处理类会判断session中是否存在Token,如果存在就在表单中生成一个隐藏域,隐藏域的值就是利用Struts的Token机制算出来的那个值。当用户接收到注册页面后就会发现在FORM表单中存在的Token的隐藏域。在用户提交了注册信息到另一个Action中时,在这个Action中用isTokenValid(request)来判断是否是重复提交,如果用户是第一次提交表单返回true,如果用户通过浏览器返回按扭,返回该页再次提交则返回false;进行错误处理。

例子:Action1:

public class RegAction extends Action {

 public ActionForward execute(
  ActionMapping mapping,
  ActionForm form,
  HttpServletRequest request,
  HttpServletResponse response) {
  //调用方法生成Token
     saveToken(request); 
  // TODO Auto-generated method stub
  return mapping.findForward("register");
 }
}


Action1转发给JSP页面:

<html:form action="/tokenAction.do" method="poset">
<html:submit>Submit</html:submit>
</html:form>


在这里会自动生成Token的隐藏域:
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="164fcc77cafd18db1011da3d8ab868e5">

Action2: jsp页面提交给过来请求

if(!isTokenValid(request))
  {
   System.out.println("重复提交TokenAction");
   saveToken(request);
   return (new ActionForward(mapping.getInput()));
  }
  else
  {
   resetToken(request);
   System.out.println("重新设置Token!   TokenAction");
  }

判断是否是重复提交,如果重复提交就转发到默认在struts-config.xml中为Action2配置的错误页面中,并重新建立一个Token。如果不是重复提交就就从当前session中删除Token.
OK,就是这些了,如果你的应用中可以返回一个错误页面,那么你也可以在filter中应用Token这些方法,只不过需要对struts的jar包进行反编译,拿到自己的类中来用。
分享到:
评论
2 楼 norrain 2010-11-05  
谢谢了,终于写好了,哈!不过好像在<html:form>下不会自动添加<input>隐藏域,需要自己添加.
1 楼 norrain 2010-11-05  
sddddddddddddd

相关推荐

    使用struts的同步令牌避免form的重复提交

    为了有效地防止Web应用程序中的表单重复提交问题,Struts框架提供了一种简单而强大的解决方案——同步令牌模式(Synchronization Token Pattern, STP)。下面详细介绍如何在Struts项目中实现这一功能。 1. **生成...

    Servlet、Struts、SpringMVC对于表单重复提交的解决方案

    总结来说,Servlet、Struts和SpringMVC都提供了各自的解决方案来防止表单重复提交,主要方法包括使用Session、令牌机制、重定向和拦截器等。开发者可以根据项目需求选择合适的方式来实现,确保应用的稳定性和数据...

    JSP避免Form重复提交的三种方案

    第三种方法是利用Struts框架的同步令牌机制。这个机制是基于会话的,它在服务器端生成一个唯一的令牌,并将其存储在用户的会话中。当表单提交时,这个令牌会随请求一起发送到服务器。服务器会验证这个令牌是否与会话...

    JSP避免Form重复提交的三种方案.docx

    3. Struts同步令牌机制: Struts框架提供了一种基于令牌的解决方案,以服务器端验证为主。其工作原理是:服务器在处理请求前,对比请求中的令牌与用户会话中的令牌是否匹配。处理后,服务器会生成新的令牌并更新...

    Java怎样防止重复提交

    在Java Web开发中,防止重复提交是一个重要的议题,尤其是在大型分布式应用中,因为这可能导致服务器资源的过度消耗,甚至引发系统性能问题。以下是一些防止重复提交的常见策略和技术: 1. **令牌(Token)机制**:...

    BBS论坛的详细设计

    BBS 论坛的详细设计 本文档将详细介绍 BBS 论坛的设计,涵盖 MVC ...为了解决 Web 应用中重复提交的问题,我们使用 Struts 的同步令牌机制(token)解决问题。在本项目中,我们主要是针对 BBS 发表的表单进行限制。

    单点登录(SingleSignOn-SSO)完整案例

    此外,开发过程中还需要考虑安全问题,如防止CSRF(跨站请求伪造)攻击,以及对令牌的加密和解密以保护用户数据的安全。在实际项目中,可能会使用Spring Security、Keycloak或Apache Shiro等安全框架来简化SSO的实现...

    sso demo 单点登录

    4. **SSO实现原理**:通常,SSO使用一种称为票据(Ticket)或令牌(Token)的机制。当用户成功登录主应用系统后,服务器会生成一个唯一的票据,存储在服务器端,并将其返回给客户端。之后,当用户尝试访问其他系统时...

    1剑盛二面准备试题.txt1剑盛二面准备试题.txt

    73. **CSRF攻击及其防范**:CSRF(跨站请求伪造)攻击者通过诱导用户在已认证的会话中执行非本意的操作,防范方法包括使用验证码、验证HTTP Referer、添加令牌(Token)等。 ### 异常知识点 74. **throw与throws的...

    spring security 参考手册中文版

    18.2同步器令牌模式 141 18.3何时使用CSRF保护 142 18.3.1 CSRF保护和JSON 142 18.3.2 CSRF和无状态浏览器应用程序 143 18.4使用Spring Security CSRF保护 143 18.4.1使用适当的HTTP动词 144 18.4.2配置CSRF保护 144...

Global site tag (gtag.js) - Google Analytics