Struts1.x 防止重复提交

Struts的Token机制能够很好的解决表单重复提交的问题,基本原理是:


服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。


在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,

也会将用户会话中保存的旧的令牌进行替换。


这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,

从而有效地防止了重复提交的发生。


这时其实也就是两点,


第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,

通过隐藏字段来保存.

保存的形式如:

〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN"value="6aa35341f25184fd996c4c918255c3ae"〉,

这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。


第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,

所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。


1.在用户通过Action到达表单提交页面的时候,首先在这个action中调用一下 this.saveToken(request);

2.在用户提交表单时候传入一个隐藏域 ,跟随表单一起提交

<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" 
value='<%=session.getAttribute("org.apache.struts.action.TOKEN")%>' />

3.在处理用户提交请求的action 中

HttpSession session = req.getSession();
String token = req.getParameter("org.apache.struts.taglib.html.TOKEN");
String token2 = (String) session.getAttribute(org.apache.struts.Globals.TRANSACTION_TOKEN_KEY);

System.out.println("token:"+token);
System.out.println("token2:"+token2);

session.removeAttribute(Globals.TRANSACTION_TOKEN_KEY);

if (StringUtils.isNotBlank(token) && token.equals(token2))

{
req.setAttribute("message", "成功提交!");
return mapping.findForward("success");
}

req.setAttribute("message", "重复提交!");
return mapping.findForward("error");

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值