Token机制

5 篇文章 0 订阅

利用Token机制可以解决表单重复提交问题。实质是服务器端每次都生成一个不同的Token值返回给客户端,同时保存在session里。客户端提交表单时,必须把此token值提交给服务器。程序判断存储在session中的Token值和请求参数中的Token值是否一致。不一致说明本次操作已经被提交过了。

 

1、什么是表单重复提交

如:对于注册表单,若用户已提交表单且服务器端成功注册了用户信息。此时用户通过浏览器回退功能,回到原来页面重复提交表单,服务器端应避免用户重复注册。

还有一种情形:提交完成后,单击浏览器的“刷新”按钮,浏览器会弹出对话框,询问是否重新提交数据。单击“是”,浏览器会重新提交数据。 

 

2、Struts1的Token机制避免重复提交表单的流程

(1)在请求某个页面时,先进入Action,调用Action的saveToken()方法,创建一个新的Token,将其保存在session中,然后将请求转发给此页面。

(2)页面中的<html:form>标签的处理类判断在session中是否存在Token,若存在,就在表单中生成一个包含Token信息的隐藏字段。当用户收到此页面后,查看源文件可以发现表单中有一个包含Token信息的隐藏字段。

(3)当用户提交表单后,进入Action,首先调用Action的isTokenValid()方法,判断当前session中的Token值和请求参数中的Token值是否一致。不一致方法返回false。若一致,方法中会调用resetToken()方法,从当前session中删除Token,且方法最后返回true。

这样,在用户提交了表单之后,通过浏览器回退功能,退回到刚才的页面,再次提交表单,由于当前session中不存在Token,则返回false。


在Struts1的Action中提供了和同步令牌相关的方法:

protectedboolean isTokenValid(HttpServletRequest request)

此方法用来判断当前用户会话中存储的令牌值和当前请求参数的令牌值是否一致,如果不一致返回false,一致则返回true。当我们利用Action进行相应调用处理时,就是利用此方法判断令牌值是否一致来决定是否进行处理。

  

  protected void saveToken(HttpServletRequest request)

此方法创建一个新的令牌值,将其保存在当前的会话(session)范围内。如果当前的会话对象不存在,则创建会话对象。

  

  protected void resetToken(HttpServletRequest request)

此方法对当前会话范围的令牌值进行复位操作,即删除当前会话范围的令牌值。

 

事实上当执行了this.saveToken之后系统自动的在所有带form表单的JSP页面的form表单代码的里面加入了隐藏域input标签代码。

当用户提交时,控制器获取隐藏域的内容,利用isValidToken方法判断此参数内容是否和会话中存储的令牌值内容匹配。

第一次提交之后一定是匹配的,但是紧接着它就把session中的令牌值删除。再点回退时,隐藏域的内容仍然是原来的值,显然再次提交时必然不会匹配的。


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值