`
geeksun
  • 浏览: 965347 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet 防止刷新重复提交

阅读更多

         在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

分享到:
评论
2 楼 geeksun 2013-12-11  
jianbo1015 写道
String token = generateToken(request);
请问这个方法怎么生产这个stoken字符串呀?

这个方法可以自己写一个,只要能生成唯一的一个字符串就可以。
1 楼 jianbo1015 2013-11-08  
String token = generateToken(request);
请问这个方法怎么生产这个stoken字符串呀?

相关推荐

    浅谈利用Session防止表单重复提交

    浅谈利用Session防止表单重复提交 Session是Web应用程序中的一种机制,用于存储用户的会话信息。在Web应用程序中,表单重复提交是一个常见的问题,可能会导致数据库中产生冗余数据,浪费数据库资源。利用Session...

    Servlet、Struts、SpringMVC对于表单重复提交的解决方案

    总结来说,Servlet、Struts和SpringMVC都提供了各自的解决方案来防止表单重复提交,主要方法包括使用Session、令牌机制、重定向和拦截器等。开发者可以根据项目需求选择合适的方式来实现,确保应用的稳定性和数据...

    Java怎样防止重复提交

    - 在Servlet容器中,可以编写一个全局的过滤器来拦截请求,检查是否为重复提交。但这需要有可靠的判断标准,如基于请求的唯一ID或令牌。 综上所述,防止重复提交的方法多种多样,具体选择哪种策略取决于应用的需求...

    表单重复提交问题1

    这种方式可以防止浏览器重定向,避免了F5刷新导致的重复提交。但是,如果用户手动刷新页面,仍有可能引发问题。 2. 使用`Response.sendRedirect()`方法: `resp.sendRedirect(req.getContextPath() + "/manager/...

    jsp项目放置表单重复提交

    本文将深入探讨这个问题,以及如何通过JavaServer Pages(JSP)技术来防止表单的重复提交。 首先,理解表单重复提交的情况。当用户点击提交按钮后,由于网络延迟或刷新页面等原因,可能会导致同一个表单的数据被多...

    解决Struts重复提交

    这样可以避免因刷新页面或重复提交导致的问题。 2. 操作状态管理(OWSM,Operation Status Management): Struts2的OWSM插件提供了一种管理用户操作状态的方法,它可以跟踪用户的请求状态,对重复请求进行拦截。...

    Java表单重复提交的避免方法

    // 清除session中的令牌,防止重复提交 session.removeAttribute("TOKEN_IN_SESSION"); out.print("转出金额:" + money); } else { // 如果令牌无效,返回错误信息或跳转到错误页面 out.print("非法请求,表单...

    十分钟内学会 避免用户刷新导致重复POST提交

    然而,当用户提交表单后,如果页面响应太慢或者用户认为操作失败而点击刷新按钮,就可能导致数据被重复提交。这种情况会给用户带来不良体验,同时也可能给服务器造成不必要的数据处理压力。 为了避免用户刷新导致的...

    JAVA防止重复提交Web表单的方法

    这是一个简单的防止重复提交的实现方式,但需要注意的是,这种方法并不完全防止所有类型的重复提交,例如,如果用户在表单提交后刷新页面,浏览器可能会自动重新发送POST请求。为了解决这个问题,可以配合使用HTTP的...

    JSP针对表单重复提交的处理方法

    JSP中一种常用的方法是利用Session来防止表单的重复提交。Session在服务器端为每个用户创建一个独立的数据存储空间,可以在其中保存用户的特定信息。以下是这种方法的具体步骤: 1. **设置Session属性**:在用户...

    servlet实现的验证码

    3. **定期刷新验证码**:限制验证码的有效时间,防止重复使用。 4. **提高可读性**:通过扭曲、旋转、添加噪声等方式使验证码更难被机器识别,但同时保持人类可读。 在“security_test”这个项目中,我们可以看到...

    Servlet生成动态验证码

    为了防止重复,可以将生成的验证码存入session中,同时设置一个过期时间。 4. 图像处理: Java的`java.awt`和`javax.imageio`包提供了丰富的图像处理功能。可以使用`Graphics`对象在图像上绘制文本、线条、形状等...

    JavaWeb中HttpSession中表单的重复提交示例

    为了防止表单重复提交,开发者通常会在表单中添加一个唯一的标记,该标记在服务器端进行验证。以下是一种有效的解决方案: 1. 在用户首次访问表单页面时,服务器生成一个随机的唯一值(如UUID),并将这个值存储在...

    详谈表单重复提交的三种情况及解决方法

    当用户提交表单后,若立即对页面进行刷新,表单数据会被再次发送到服务器,造成重复提交。为解决此问题,可以改用重定向而非转发。在Servlet处理完请求后,不是使用`request.getRequestDispatcher()`进行转发,而是...

    javaweb登入注册+答题系统 解决了反之用户重复登陆

    当用户成功登录后,服务器会创建一个session并存储用户的登录信息,每次后续请求时,服务器会检查session中的信息,判断用户是否已登录,防止同一用户重复登录。 6. **安全机制**: 在注册过程中,系统可能包含防止...

    servlet写验证码易懂做着简单

    6. **清理Session**:验证成功后,应清除Session中的验证码,以防止重复使用。 在这个案例中,"img"可能是验证码图像文件的名称,表示在Servlet中生成的验证码图像已经保存并可供下载。由于没有具体的代码示例,...

    简易投票系统jsp+servlet+javabean

    此外,考虑到安全性,系统可能需要添加用户身份验证、防止重复投票等机制。 总的来说,“简易投票系统jsp+servlet+javabean”项目是一个典型的Java Web开发实例,涵盖了前端交互、后端处理以及数据管理的核心技术,...

    jsp+ajax 无刷新聊天室

    在实现"jsp+ajax 无刷新聊天室"的过程中,开发者可能会遇到一些挑战,比如如何处理多个并发的Ajax请求,如何防止重复发送消息,如何优化数据传输以减少网络延迟等。解决这些问题需要对网络通信、并发控制和性能优化...

    JAVA实现注册页面验证码刷新

    - **重定向(Redirect)**:在某些情况下,如果需要避免表单重复提交,服务器可能会选择重定向用户到另一个页面。 6. **安全考虑**: - **验证码过期**:为了防止会话固定攻击,验证码应设置一个较短的有效期,如...

    纯servlet的登陆注册

    3. **Ajax交互**:利用jQuery的Ajax功能,实现无刷新的登录和注册提交,提升用户体验。 4. **动态效果**:添加如表单提示、错误提示等动态效果,增强用户体验。 项目的结构通常如下: - `.classpath`:Eclipse项目...

Global site tag (gtag.js) - Google Analytics