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:

Java代码 复制代码
  1. public class RegAction extends Action {   
  2.   
  3.  public ActionForward execute(   
  4.   ActionMapping mapping,   
  5.   ActionForm form,   
  6.   HttpServletRequest request,   
  7.   HttpServletResponse response) {   
  8.   //调用方法生成Token   
  9.      saveToken(request);    
  10.   // TODO Auto-generated method stub   
  11.   return mapping.findForward("register");   
  12.  }   
  13. }  


Action1转发给JSP页面:

Java代码 复制代码
  1. <html:form action="/tokenAction.do" method="poset">   
  2. <html:submit>Submit</html:submit>   
  3. </html:form>  


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

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

Java代码 复制代码
  1. if(!isTokenValid(request))   
  2.   {   
  3.    System.out.println("重复提交TokenAction");   
  4.    saveToken(request);   
  5.    return (new ActionForward(mapping.getInput()));   
  6.   }   
  7.   else  
  8.   {   
  9.    resetToken(request);   
  10.    System.out.println("重新设置Token!   TokenAction");   
  11.   }  

判断是否是重复提交,如果重复提交就转发到默认在struts-config.xml中为Action2配置的错误页面中,并重新建立一个Token。如果不是重复提交就就从当前session中删除Token.
OK,就是这些了,如果你的应用中可以返回一个错误页面,那么你也可以在filter中应用Token这些方法,只不过需要对struts的jar包进行反编译,拿到自己的类中来用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值