在java web工程中,当jsp向Servlet提交请求时,如何防止刷新提交(F5)?
第一种解决方法,参照老紫竹的思路:
可以使用的方法有,在jsp中定义一个变量值,这个变量值应该是唯一的,可以使用算法来保证生成数据的唯一性,例如hash算法,或者生成一个随机数(Random),并将这个数值保存到一个Set中,并将Set保存在session中,提交Servlet时将这个参数传递过去,在Servlet中的处理:接到参数和session中的set后,判断set中有没有传来的参数值,如果没有则页面是刷新造成的,并不是来自页面的提交,这时不做insert data的处理。
jsp
代码
:
<%
//生成一个formhash,算法可以自己定,不随便重复就可以了
Random ran = new Random();
String formhash = String.valueOf(ran.nextInt());
//读取当前session里面的hashCode集合,此处使用了Set,方便判断。
Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
if (formhashSession == null) {
formhashSession = new HashSet<String>();
}
// 检测重复问题
while (formhashSession.contains(formhash)) {
formhash = String.valueOf(ran.nextInt());
}
// 保存到session里面
formhashSession.add(formhash);
// 保存
session.setAttribute("formhashSession", formhashSession);
%>
<form>中增加:<input type="hidden" name="formhash" id="formhash" value="<%=formhash%>" />
Servlet代码:
// 拿到表单的formhash
String formhash = request.getParameter("formhash");
// 拿到session里面的集合
Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
// 如果没有,则是重复提交,或者非法提交
if (formhashSession == null || !formhashSession.contains(formhash)) {
System.out.println("重复提交!");
}else{
//正常的操作
}
// 最后,如果操作成功,从session里面把这个formhash 删掉!
formhashSession.remove(formhash);
session.setAttribute("formhashSession", formhashSession);
参考文章:http://blog.csdn.net/java2000_net/archive/2008/02/25/2119298.aspx
第二种解决方法,
参考struts的token(令牌)机制:
在提交的时候在Servlet中根据用户的sessionid和当前时间的long值生成一个令牌(每次提交都会生成一个新令牌),将令牌保存在该用户的会话中,并将令牌的值以request属性形式传到前端页面,在前端页面的form中增加传递令牌的隐藏域<input type="hidden" name="clientToken" value="<%=clientToken%>" />,提交form的时候,也会将clientToken传入Servlet,如果session中保存的令牌值与传入的不同,则是重复提交,因为每次请求Servlet都会生成新的令牌,刷新时的令牌值是旧的令牌值,不是最新的令牌值。
jsp代码:
<%
String clientToken = (String)request.getAttribute("clientToken");
clientToken = clientToken==null?"":clientToken;
%>
<form>中增加<input type="hidden" name="clientToken" value="<%=clientToken%>" />
Servlet代码:
String clientToken = request.getParameter("clientToken");
String sessionToken = (String) session.getAttribute("token");
if(sessionToken!=null&&!clientToken.equals(sessionToken)){
System.out.println("请不要重复提交!");
}else{
//正常的操作
}
//生成新令牌
String token = generateToken(request);
request.setAttribute("clientToken", token);
//替换旧令牌
session.setAttribute("token", token);
参考文献:http://www.blogjava.net/yrJavaWorld/archive/2007/10/09/50020.html
分享到:
相关推荐
Servlet、Struts、SpringMVC对于表单重复提交的解决方案
1.纯servlet+jquery局部刷新; 2.fresh 后台包含 json内容,需要json相关jar包,自行下载,不需要的可以删除; 3.有页面点击事件,初学者可以研究下; 4.QQ569317668 不喜勿喷 servlet局部刷新及json字符串 相互学习...
关于用Ajax验证用户名的实例使用Ajax后用户输入用户名后不需要刷新页面
使用ajax和jsp servlet实现网页局部刷新,,,聊天功能
采用js jsp ajax实现网页局部刷新技术
JSP +servlet 无刷新上传文件,文件源自己网络。但是为了适应自己的需求,作了适当修改,可以在传文件的时候也可以提交其他text数据。
自己写的利用jsp,servlet,加上ajax实现区域和街道的级联效果的部分关键代码,数据从数据库读取,然后通过点击区域ajax动态切换街道实现无刷新页面。
浏览器自动刷新的实现servlet浏览器自动刷新的实现servlet浏览器自动刷新的实现servlet
接收来自form表单提交的数据; 并在网页上显示出来
jsp+servlet+from表单提交,上传头像,写入服务器
通过Ajax技术调用Servlet, 得到需要刷新的数据。
建立一个html网页让用户输入姓名、爱好等信息,然后传给servlet,最终展示出来。
ajax+java servlet实现无刷新搜索实例(亲测可用) ,1.使用mysql数据库,已有sql语句;2.使用eclipse\MyEclipse导入项目即可;3.运行URL地址在doc/init.txt
Jsp+Servlet+Cookie实现记住密码,自动登录,防止表单提交,记录登录次数的新手例子。简单明了,大量注释,El表达式等。
jsp与JavaScript提交至servlet的几种方式
主要介绍了IDEA中HTML通过servlet3.0注解名提交表单到servlet类找不到页面的问题,本文通过场景描述及问题解析,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
该资源主要参考博客...其中包括两个资源,一个是Servlet简单提交表单并获取表单结果的资源,一个数据库简单查询连接的操作。 都是学习Java Web开放的基础知识,希望对初学者有所帮助。免费资源,不喜勿喷~
主要为大家详细介绍了servlet+jsp实现过滤器,防止用户未登录访问,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本案例使用Servlet+Ajax实现搜索框智能提示,仿百度智能提示。
该案例是一个ajax异步提交中文字符串的案例。该案例是一个ajax异步提交中文字符串的案例。该案例是一个ajax异步提交中文字符串的案例。