java中可以使用token来进行拦截重复提交问题,
nodejs中是否有相关的插件或者module来解决这个安全问题。。
理论上来说,越简单越好。。。队列什么的,唉。。
java中可以使用token来进行拦截重复提交问题,
nodejs中是否有相关的插件或者module来解决这个安全问题。。
理论上来说,越简单越好。。。队列什么的,唉。。
@KaiChen :3Q 4 U answer ~~
我用express-rate-limit实现了一下,
在不改写这个module(以下简称rl)的前提下,会有几个问题:
2019年04月01日21:05:17更新
/**
* 使用 redis-set 来限制仅允许1次频率的访问
* @param {string} key 唯一标记
* @param {number} expire 过期时间(单位s)
* @param {string} msg 错误信息
*/
function rateLimitRequestByKey(key, expire, msg = '请求频率过快') {
const member = 'rateLimit'; // set-member键
const setKey = `${member}:${key}`; // set-key键
return new Promise((resolve, reject) => {
redisClient
.multi() // 开启事务
.sadd(setKey, member)
.expire(setKey, expire)
.exec((err, reply) => {
if (err) { reject(err); }
if (reply && reply.length === 2 && reply[0] === 0) {
const error = new Error(msg);
error.name = 'RateLimitRequestError';
reject(error);
}
return resolve(reply);
});
});
}
3 回答2.6k 阅读✓ 已解决
1 回答948 阅读✓ 已解决
2 回答1.2k 阅读
1 回答1.1k 阅读✓ 已解决
2 回答629 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.1k 阅读
最简单的方法是在客户端那边去做限制,在最后一个请求没响应回来之前不能发起另外的请求。
服务端这边方法也有很多,
最简单在数据库层面防止重复数据写入
使用一些 RateLimit 定义规定时间内同一操作不能超过多少次,如果你用的是 Express 可以用这个 https://github.com/nfriedly/express-rate-limit
正如你提到的采用队列写入
每次提交都需要申请一个 token ,每个 token 只能用一次