不需要前台传token,这样防订单重复提交有其他问题吗?

后期项目维护,肯定没办法一个表单一个表单的添加token,进行防止重复提交。网上大多都是前台token+后台拦截的方式。结合了之前spring aop写的一个防重复提交的方法,写了下面这个新的,请大神指教存在的问题。

(Invocation invocation) {
    HttpServletRequest request = invocation.getController().getRequest()HttpSession session =request .getSession()String userId = session.getAttribute().toString()String servletPath = request.getServletPath()Object o = .get(userId + + servletPath)(o==){
        .setex(userId + + servletPath)invocation.invoke()}}


其中userId是登录后保存在redis中的用户id,加上请求路径形成唯一key。3秒之内重复点击同一个请求则不进行处理!


评论区

程序员是真的雷

2019-09-21 20:00

public void intercept(Invocation invocation) {
HttpServletRequest request = invocation.getController().getRequest();
HttpSession session =request .getSession();
String userId = session.getAttribute("userId").toString();
String servletPath = request.getServletPath();
Object o = cache.get(userId + "-" + servletPath);
if (o==null){
cache.setex(userId + "-" + servletPath,3,"norepeat");
invocation.invoke();
}else return;
}

JFinal

2019-09-21 20:28

直接改前端,提交用 ajax 触发

用一个 boolean submitting 变量,在 ajax 提交之前将这个变量置为 true,后续的提交请求要判断这个变量,如果为 true ,直接 return :
var submitting = false; // 这个变量为全局变量
function ajaxSubmit() {
if (submitting) {
return ;
} else {
submitting = true;
}
// 这里写提交的具体逻辑,用 ajax 提交,在回调方法中将 submitting 再置为 false
submitting = false;
}



后面如果碰到多次提交按钮的点击也不会提交

JFinal

2019-09-21 20:29

用 ajax 提交的好处:
1:用户提交后,按 F5 刷新,不会造成重复提交
2: 使用 boolean submitting 变量,防止用户多次重复点击 "提交" 按钮造成的重复提交

JFinal

2019-09-21 20:36

如果还是不会的话,在本网页点击右键,查看本页面的 js 代码,基本照抄即可,大致如下:
var map = {
isLoading: false
, submit_btn: $("#submit_btn")
, submit_loading: $("#submit_loading")
};

$("#submit_btn").bind("click", function() {
reply("/feedback/saveReply", "6505", map);
});

$("#replyContent").bind("keydown", function(e) {
if ((e.ctrlKey || e.metaKey) && e.keyCode==13) { // ctrl + 回车发送消息
reply("/feedback/saveReply", "6505", map);
}
});

本站用的是 boolean isLoading 变量,是放在一个全局的 map 之中来使用的

playsex

2019-09-22 16:28

@JFinal 他应该是想从服务端解决重复提交

小白菜111

2019-09-25 09:09

给参数增加md5字符串,比较字符串,,这是个暴力解决方法!

程序员是真的雷

2019-09-25 13:59

@JFinal 谢谢波哥,学习了。这两天比较忙,给忘记了。

程序员是真的雷

2019-09-25 14:00

@playsex 您说的对,我主要是前端不熟,所以想直接通过后端解决

JFinal

2019-09-25 17:46

@程序员是真的雷 通过后端麻烦一些,用本站前端的代码解决

热门反馈

扫码入社