java中可以使用token来进行拦截重复提交问题,
nodejs中是否有相关的插件或者module来解决这个安全问题。。
理论上来说,越简单越好。。。队列什么的,唉。。
参考cnode中《node.js 在服务器端避免重复提交有没有什么好办法吗?》
小伙看你根骨奇佳,潜力无限,来学PHP伐。
最简单的方法是在客户端那边去做限制,在最后一个请求没响应回来之前不能发起另外的请求。
服务端这边方法也有很多,
最简单在数据库层面防止重复数据写入
使用一些 RateLimit 定义规定时间内同一操作不能超过多少次,如果你用的是 Express 可以用这个 https://github.com/nfriedly/express-rate-limit
正如你提到的采用队列写入
每次提交都需要申请一个 token ,每个 token 只能用一次
@KaiChen :3Q 4 U answer ~~
我用express-rate-limit实现了一下,
在不改写这个module(以下简称rl)的前提下,会有几个问题:
首先,看源码,rl将req.ip存放在一个全局变量中,当使用nginx做反向代理的时候,所有的req.ip会指向nginx的代理ip地址,所以这个rl在生产上应该会变现出ip重复问题
其次,max限制次数的逻辑问题,当设置max大于1之后,次数越多,请求的延迟时间越长,找到一个解决方法是设置【delayMs:0】
最主要的,他的返回message只支持string型,“first argument must be a string or Buffer”,在res的返回中,我们绝大部分使用的是res.json,纯string数据需要使用正则去进行匹配来判断是否是成功请求。
最简单的方法是在客户端那边去做限制,在最后一个请求没响应回来之前不能发起另外的请求。
服务端这边方法也有很多,
最简单在数据库层面防止重复数据写入
使用一些 RateLimit 定义规定时间内同一操作不能超过多少次,如果你用的是 Express 可以用这个 https://github.com/nfriedly/express-rate-limit
正如你提到的采用队列写入
每次提交都需要申请一个 token ,每个 token 只能用一次
@KaiChen :3Q 4 U answer ~~
我用express-rate-limit实现了一下,
在不改写这个module(以下简称rl)的前提下,会有几个问题:
首先,看源码,rl将req.ip存放在一个全局变量中,当使用nginx做反向代理的时候,所有的req.ip会指向nginx的代理ip地址,所以这个rl在生产上应该会变现出ip重复问题
其次,max限制次数的逻辑问题,当设置max大于1之后,次数越多,请求的延迟时间越长,找到一个解决方法是设置【delayMs:0】
最主要的,他的返回message只支持string型,“first argument must be a string or Buffer”,在res的返回中,我们绝大部分使用的是res.json,纯string数据需要使用正则去进行匹配来判断是否是成功请求。