在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
分享到:
相关推荐
浅谈利用Session防止表单重复提交 Session是Web应用程序中的一种机制,用于存储用户的会话信息。在Web应用程序中,表单重复提交是一个常见的问题,可能会导致数据库中产生冗余数据,浪费数据库资源。利用Session...
总结来说,Servlet、Struts和SpringMVC都提供了各自的解决方案来防止表单重复提交,主要方法包括使用Session、令牌机制、重定向和拦截器等。开发者可以根据项目需求选择合适的方式来实现,确保应用的稳定性和数据...
- 在Servlet容器中,可以编写一个全局的过滤器来拦截请求,检查是否为重复提交。但这需要有可靠的判断标准,如基于请求的唯一ID或令牌。 综上所述,防止重复提交的方法多种多样,具体选择哪种策略取决于应用的需求...
这种方式可以防止浏览器重定向,避免了F5刷新导致的重复提交。但是,如果用户手动刷新页面,仍有可能引发问题。 2. 使用`Response.sendRedirect()`方法: `resp.sendRedirect(req.getContextPath() + "/manager/...
本文将深入探讨这个问题,以及如何通过JavaServer Pages(JSP)技术来防止表单的重复提交。 首先,理解表单重复提交的情况。当用户点击提交按钮后,由于网络延迟或刷新页面等原因,可能会导致同一个表单的数据被多...
这样可以避免因刷新页面或重复提交导致的问题。 2. 操作状态管理(OWSM,Operation Status Management): Struts2的OWSM插件提供了一种管理用户操作状态的方法,它可以跟踪用户的请求状态,对重复请求进行拦截。...
// 清除session中的令牌,防止重复提交 session.removeAttribute("TOKEN_IN_SESSION"); out.print("转出金额:" + money); } else { // 如果令牌无效,返回错误信息或跳转到错误页面 out.print("非法请求,表单...
然而,当用户提交表单后,如果页面响应太慢或者用户认为操作失败而点击刷新按钮,就可能导致数据被重复提交。这种情况会给用户带来不良体验,同时也可能给服务器造成不必要的数据处理压力。 为了避免用户刷新导致的...
这是一个简单的防止重复提交的实现方式,但需要注意的是,这种方法并不完全防止所有类型的重复提交,例如,如果用户在表单提交后刷新页面,浏览器可能会自动重新发送POST请求。为了解决这个问题,可以配合使用HTTP的...
JSP中一种常用的方法是利用Session来防止表单的重复提交。Session在服务器端为每个用户创建一个独立的数据存储空间,可以在其中保存用户的特定信息。以下是这种方法的具体步骤: 1. **设置Session属性**:在用户...
3. **定期刷新验证码**:限制验证码的有效时间,防止重复使用。 4. **提高可读性**:通过扭曲、旋转、添加噪声等方式使验证码更难被机器识别,但同时保持人类可读。 在“security_test”这个项目中,我们可以看到...
为了防止重复,可以将生成的验证码存入session中,同时设置一个过期时间。 4. 图像处理: Java的`java.awt`和`javax.imageio`包提供了丰富的图像处理功能。可以使用`Graphics`对象在图像上绘制文本、线条、形状等...
为了防止表单重复提交,开发者通常会在表单中添加一个唯一的标记,该标记在服务器端进行验证。以下是一种有效的解决方案: 1. 在用户首次访问表单页面时,服务器生成一个随机的唯一值(如UUID),并将这个值存储在...
当用户提交表单后,若立即对页面进行刷新,表单数据会被再次发送到服务器,造成重复提交。为解决此问题,可以改用重定向而非转发。在Servlet处理完请求后,不是使用`request.getRequestDispatcher()`进行转发,而是...
当用户成功登录后,服务器会创建一个session并存储用户的登录信息,每次后续请求时,服务器会检查session中的信息,判断用户是否已登录,防止同一用户重复登录。 6. **安全机制**: 在注册过程中,系统可能包含防止...
6. **清理Session**:验证成功后,应清除Session中的验证码,以防止重复使用。 在这个案例中,"img"可能是验证码图像文件的名称,表示在Servlet中生成的验证码图像已经保存并可供下载。由于没有具体的代码示例,...
此外,考虑到安全性,系统可能需要添加用户身份验证、防止重复投票等机制。 总的来说,“简易投票系统jsp+servlet+javabean”项目是一个典型的Java Web开发实例,涵盖了前端交互、后端处理以及数据管理的核心技术,...
在实现"jsp+ajax 无刷新聊天室"的过程中,开发者可能会遇到一些挑战,比如如何处理多个并发的Ajax请求,如何防止重复发送消息,如何优化数据传输以减少网络延迟等。解决这些问题需要对网络通信、并发控制和性能优化...
- **重定向(Redirect)**:在某些情况下,如果需要避免表单重复提交,服务器可能会选择重定向用户到另一个页面。 6. **安全考虑**: - **验证码过期**:为了防止会话固定攻击,验证码应设置一个较短的有效期,如...
3. **Ajax交互**:利用jQuery的Ajax功能,实现无刷新的登录和注册提交,提升用户体验。 4. **动态效果**:添加如表单提示、错误提示等动态效果,增强用户体验。 项目的结构通常如下: - `.classpath`:Eclipse项目...