防止表单重复提交
来源:互联网 发布:linux 主机别名 编辑:程序博客网 时间:2024/06/07 02:22
为防止表单的重复提交,需要在前台jsp页面和后台代码里做如下事情:
1、前台jsp页面
这里只考虑IE和FF浏览器。
1)调用判断当前浏览器类型的代码
function browserType(){
//取得浏览器的userAgent字符串
var userAgent = navigator.userAgent;
var userAgent = navigator.userAgent;
if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1
&& !isOpera){
return "IE";
} ;
if (userAgent.indexOf("Firefox") > -1){
return "FF";
}
if (userAgent.indexOf("Opera") > -1){
return "Opera"
};
if (userAgent.indexOf("Chrome") > -1){
return "Chrome";
}
if (userAgent.indexOf("Safari") > -1){
return "Safari";
}
}
2)禁止浏览器后退(IE)或使提交按钮变为不可用(FF)
2)禁止浏览器后退(IE)或使提交按钮变为不可用(FF)
A、若当前为IE浏览器添加如下代码禁止浏览器后退:
<script type="text/javascript">
javascript:window.history.forward(1);
</script>
javascript:window.history.forward(1);
</script>
但若浏览器地址栏未发生变化,用户仍可以在禁止重复提交页面的后一个或后几个页面通过刷新页面重复提交,所以还需要禁止用户使用右击菜单中的“刷新”和F5。
B、若当前为FF浏览器添加如下代码使提交按钮变为不可用:
$("#submit").attr("disabled", "disabled");
但用户仍可以通过刷新页面重复提交,所以同样也需要禁止用户使用右击菜单中的“刷新”和F5。
3)禁止右击菜单中的“刷新”进行重复提交
document.oncontextmenu = function(){
return false;
}
return false;
}
4)禁止使用F5刷新页面重复提交
$(document).keydown(function(event){
if(event.keyCode==116){
return false;
if(event.keyCode==116){
return false;
}
});
});
以下代码可以起点辅助作用:
<!-- 清除浏览器缓存 -->
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">
以上js代码可能不能对所有浏览器有效,所以还需要使用后台代码做最后防护。
2、后台代码
struts2的token机制可以防止用户重复提交:
a)在<form>标签里添加<s:token/>标签;
b)在struts2.xml里添加如下代码:
<action name="regist" class="action.UserAction" method="regist">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="token/>
<result>/userPages/login.jsp</result>
<result name="invalid.token">/error.jsp?msg=不允许重复提交!</result>
</action>
c)在error.jsp页面里增加如下代码:
${param.msg}
当然我们也可以借鉴Struts2的token机制在原生的Servlet里实现我们自己的token机制:
在regist()方法里增加如下代码:
String newSessionId = request.getSession().getSessionId();
String oldSessionId= Cache.getSessionId();
if(newSessionId.equals(oldSessionId)){
msg = "不允许重复提交!";
request.getRequestDispatcher("/userPages/regist.jsp").forward(request, response);
}
Cache.setSessionId(newSessionId);
//调用服务层用户注册逻辑...
再在/userPage/regist.jsp页面增加如下代码:
${msg}
上面的Cache是自定义的一个普通的缓存类。当然上面的代码有些细节可能有语法错误,但大致如此。
以上可以做到完全禁止用户重复提交,其实有了后台Struts2的token机制,前台页面不用做任何操作,但为了减轻服务器的压力,还是应该先在页面予以禁止。
参考文档:
判断当前浏览器类型:http://blog.csdn.net/xianzi0828/article/details/7582408
禁止页面重复提交:http://waj952737.iteye.com/blog/972903
Struts2的token机制:http://blog.csdn.net/yutian888/article/details/6376858
- 顶
- 0
- 踩
0 0
- 防止表单重复提交
- 防止重复提交表单
- 防止表单重复提交
- 防止表单重复提交
- 防止表单重复提交
- 防止表单重复提交
- 防止表单重复提交
- 防止表单重复提交
- 防止表单重复提交
- 防止重复提交表单
- 防止表单重复提交
- 表单防止重复提交
- 防止表单重复提交!
- 防止表单重复提交
- 防止表单重复提交
- 防止表单重复提交
- 防止表单重复提交
- 防止表单重复提交
- Android事件总线(一)EventBus3.0用法全解析
- Android Studio使用过程中Java类突然报红,但项目可运行解决方案
- Python爬虫入门二之爬虫基础了解
- TypeScript 数组定义方式
- 不要让懒惰害了你
- 防止表单重复提交
- 万能地图下载器中怎么把DWG导入谷歌地图,再导出KML文件
- Core Java note part01
- 安全退出已调用多个Activity的Application
- Python基础
- 时间戳转换为时间格式,时间格式转换为时间戳
- 深入理解jvm — GC篇
- ftp
- (OK) 华为全网通 honor 5x