为防止表单的重复提交,需要在前台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://waj952737.iteye.com/blog/972903
Struts2的token机制:
http://blog.csdn.net/yutian888/article/details/6376858