表单提交到servlet后,服务器端跳转后,刷新页面重复提交数据,怎么办?
解决方案 »
- JSP页面中关于传递对象的问题
- 问个页面传值问题,带?的传值方式
- 奇怪!!!!tomcat开始一周发送一次邮件,但是改为1分钟发送一次后,再改回一周发送一次,结果还是一分钟发送一次!
- 新手求解,css的link链接希望大家帮助,谢谢大家~!
- 求文件夹WEB-INF的详细讲解(尤其是web.xml中的语句) 如果能给出详细的介绍或是资料 小生愿意出200分~!
- 新手请教帮忙解决一个简单用户登录页面的出错
- 很烦躁的空指针报错!请大家帮忙看看!在线等!!!!
- java中如何识别日文全角字
- javabean制作完了之后怎样添加到Jbuilder控件中?
- 求助,在Servlet中的ServletException如何在JSP页面显示出来,而不是500 ERROR?急!
- 求救 list.subList(0,2) 为什么报 ClassCastException
- web service发布和调用思路?
//生成一个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
2.使用Struts2里面的token拦截器
换用客户端 js 重定向, location.replace 会替换浏览器的访问记录,刷新不会导致重复提交。
缺点:多发一次请求和响应-----------------------如果非得使用服务端的 请求转发, 则只能使用上面高手所说的 令牌机制了