因为安全扫描的问题,它会把线上真实的访问流量进行重放,而且重发时间间隔比较短,导致一个请求变成多次请求,也就是重复提交了。那么怎样解决这个问题呢?
一般来说是通过request token来防止重复提交的。具体实现机制是:
当客户端请求页面时,服务器会通过token标签生成一个随机token,并且将该token放置到全局session当中,然后将该随机数发向客户端;如果客户第一次提交,那么会将该随机数发往服务器端,服务器会接收到该token并且与session中所保存的token进行比较,这时两者的值是相同的,服务器认为是第一次提交,并且将更新服务器端的这个token;如果此时再次重复提交,那么客户端发向服务器端的token还是之前的那个,而服务器端的token则已经发生了变化,两者不同,服务器就认为这是重复提交。
这种方式,一个POST请求是分为两步:
- 服务端分配token
- 客户端提交请求
比较适合于form表单提交的方式,因为就是两个步骤。但是对于API来说,没有先跳转到表单页面的步骤,那么可以这么处理:
- 客户端生成一个token,提交到服务端
- 服务端保存一段时间(在这段时间内重复提交相同的token就认为是重复提交)
具体实现方案这么做:
- 使用redis来存储request token,并且设置合理的超时时间
- 使用注解方便用户控制,使用拦截器尽量对应用透明
TIPS 可以用sign签名的做法防止参数串改。但是不能防止一模一样重复提交。