`
yufeng521000
  • 浏览: 6712 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Spring2.5MVC实现控制重复提交

阅读更多

1.实现原理:

  提交表单时,从session中取出当前的token值与保存在页面上token值进行比较,如果相等,可以保存表单数据,并将新生成的token保存到session中,如果不相等,则判断为重复提交。

本例采用spring的HandlerInterceptorAdapter拦截器来实现控制重复提交。

 

2.spring 配置:spring-servlet.xml

  <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
   
    <!--
        - The controllers are autodetected POJOs labeled with the @Controller annotation.
    -->
 <context:component-scan base-package="com.allwin" use-default-filters="false" > 
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 
 </context:component-scan>
 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
     <property name="webBindingInitializer">  
         <bean class="com.allwin.erp.web.action.common.WebBindingObjectRegister" />  
     </property>
    </bean>

    <!--
        - This bean configures the 'prefix' and 'suffix' properties of
        - InternalResourceViewResolver, which resolves logical view names
        - returned by Controllers. For example, a logical view name of "vets"
        - will be mapped to "/WEB-INF/jsp/vets.jsp".
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
       p:prefix="/WEB-INF/jsp/"
       p:suffix=".jsp" />
      
    <context:annotation-config/>
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
        <property name="defaultEncoding"><value>UTF-8</value></property>   
        <property name="maxUploadSize">
            <value>52428800</value> 
        </property> 
 </bean>
 <!--
        - This bean controller double submit
    -->
 <bean id="doubleSubmitInterceptor" class="com.allwin.erp.web.action.common.DoubleSubmitInterceptor">  
 <!--
        - 配置要拦截的url
    -->

    

 <property name="mappingURL" value=".*/(save|approve|active)\.do" />
     <property name="viewURL" value=".*/(view|copy)\.do" />  
 </bean> 
 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
     <property name="interceptors"> 
         <list> 
             <ref bean="doubleSubmitInterceptor"/> 
         </list> 
      </property> 
 </bean> 
</beans>

红色字体部分是配置判断重复提交的拦截器

 

3.java类HandlerInterceptorAdapter.java

 

public class DoubleSubmitInterceptor extends HandlerInterceptorAdapter {
 
 // matches URL
 private String mappingURL;
 private String viewURL;
 // page number
 private static long pageNum = 0l;
 /**
  * summary: filter request(view/save/approve/active method)
  *
  * @param : request HttpServletRequest
  * @param : response HttpServletResponse
  * @param : handler Object
  *
  * @return boolean true:normal false:double submit
  */
 @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
  String url=request.getRequestURL().toString();  
  // 设置页面编号
  if(url.matches(viewURL)){
   if(Strings.isEmpty(request.getParameter("pageNum"))){
    request.getSession().setAttribute("pageNum",++pageNum);
   }
  }
        if(url.matches(mappingURL)){
         // 设置当前token名称(即session中存放token数据的key值)
         String tokenName = handler.getClass().getSimpleName() + request.getParameter("pageNum");
         // 取得当前session中的token值
         String sessionToken = (String)request.getSession().getAttribute(tokenName);
         if(sessionToken == null || sessionToken.equals("")){
          // 生成新的token
          long date = new Date().getTime();
          request.getSession().setAttribute(tokenName, request.getSession().getId() + String.valueOf(date));
          request.getSession().setAttribute("token", request.getSession().getId() + String.valueOf(date));
          request.getSession().setAttribute("pageNum",request.getParameter("pageNum"));
          return true;
         } else { // 判断是否重复提交(如果session中的token值与request中的token值不一致则判定重复提交)
    String requestToken = (String)request.getParameter("token");
          if(requestToken == null || !requestToken.equals(sessionToken)){           
           request.getRequestDispatcher("/front/doubleSubmit.jsp").forward(request, response);  
           return false;
          } else {
           // 替换旧的token
           long date = new Date().getTime();
           request.getSession().setAttribute(tokenName, request.getSession().getId() + String.valueOf(date));
           request.getSession().setAttribute("token", request.getSession().getId() + String.valueOf(date));
           request.getSession().setAttribute("pageNum",request.getParameter("pageNum"));
           return true;
          }
         }
        } else {
         return true;
        }
    }  
 /**
  * @param mappingURL the mappingURL to set
  */
 public void setMappingURL(String mappingURL) {
  this.mappingURL = mappingURL;
 }
 /**
  * @param viewURL the viewURL to set
  */
 public void setViewURL(String viewURL) {
  this.viewURL = viewURL;
 }
}

 

4.jsp

在保存数据表单的jsp中加如两个隐藏变量

<input type="hidden" name="token" id="token" value="${token}"> session中的token值
<input type="hidden" name="pageNum" id="pageNum" value="${pageNum}">生成页面唯一编号

 

分享到:
评论
10 楼 cq.ronadlo 2011-03-11  
那个我想问问高人  查询的时候都是Manager.getById(id);  那做登录的话不是要查 id和密码么  怎么办 我是freshman    cq.ronadlo@gmail.com
9 楼 魔力猫咪 2010-04-20  
slaser 写道
魔力猫咪 写道
一般重复提交都是提交完了,转到结果页面。然后又刷新页面。因为页面的URL其实是提交地址,造成重复提交。如果处理完提交后不是forward而是redirect,那么是否可以避免重复提交呢?

这个也未必的,有些系统你点下提交按钮,它会顿一下,这下有些用户就会狂点提交按钮。

这个倒好说。提交的时候锁定提交按钮就可以。刷新页面因为是查询页面的url,也不会造成重复提交。
8 楼 slaser 2010-04-20  
魔力猫咪 写道
一般重复提交都是提交完了,转到结果页面。然后又刷新页面。因为页面的URL其实是提交地址,造成重复提交。如果处理完提交后不是forward而是redirect,那么是否可以避免重复提交呢?

这个也未必的,有些系统你点下提交按钮,它会顿一下,这下有些用户就会狂点提交按钮。
7 楼 魔力猫咪 2010-04-19  
一般重复提交都是提交完了,转到结果页面。然后又刷新页面。因为页面的URL其实是提交地址,造成重复提交。如果处理完提交后不是forward而是redirect,那么是否可以避免重复提交呢?
6 楼 slaser 2010-04-19  
条件判断那边需要加一个同步锁。
5 楼 slaser 2010-04-19  
你这东西貌似不能完全避免重复提交啊。在你替换旧的token之前,可能第二次提交的线程已经过了条件判断。
4 楼 ssuupv 2010-04-19  
针对spring mvc里面的方法能拦截吗?
3 楼 fancyboy2050 2010-03-26  
兄弟能把你的帖子编辑下么?眼花缭乱。
2 楼 yufeng521000 2010-03-25  
希望大家回复一下,有不足的地方,请指出来! 谢谢
1 楼 yufeng521000 2010-03-24  
希望大家提出宝贵意见 谢谢!

相关推荐

    基于java的的个人博客网站的设计与实现设计与实现.docx

    基于java的的个人博客网站的设计与实现设计与实现.docx

    基于java的技术大健康综合咨询问诊平台的设计与实现.docx

    基于java的技术大健康综合咨询问诊平台的设计与实现.docx

    java-ssm+vue小型企业办公自动化系统实现源码(项目源码-说明文档)

    系统可以提供信息显示和相应服务,其管理员管理部门经理,管理总经理,管理员工和员工留言以及员工工资,管理内部邮件,管理审批流程,管理离职申请。部门经理给员工发放工资,审核并回复员工留言,管理员工工资,审核员工的离职申请信息,查询和下载内部邮件以及审批流程。总经理查询下载内部邮件和审批流程,审核员工离职申请,查询员工工资,查询员工和部门经理。员工发布留言,发布内部邮件,发布离职申请,查询通知公告和审批流程,查看员工本人工资。 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    基于java的网上办公自动化系统设计与实现.docx

    基于java的网上办公自动化系统设计与实现.docx

    2019优益C x 易烊千玺微博营销案结案报告.pptx

    2019优益C x 易烊千玺微博营销案结案报告.pptx

    led-tcp-maste资源

    led-tcp-maste资源

    金士顿U盘微博营销活动策划方案.ppt

    金士顿U盘微博营销活动策划方案.ppt

    chipup芯昇XS2180-PoE芯片说明,详细版

    chipup芯昇XS2180-PoE芯片说明,详细版

    #_ssm_105_mysql_学生比赛指导管理系统_.zip

    均包含代码,文章,部分项目包含ppt

    基于java的中小企业人力资源管理系统的设计与实现.docx

    基于java的中小企业人力资源管理系统的设计与实现.docx

    C语言入门教程.zip

    【c语言入门】 静态库、动态链接库、include、makefile、io、文件操作函数、管道原理及应用、简单的数据结构

    基于java的在线学习系统设计与实现系统设计与实现.docx

    基于java的在线学习系统设计与实现系统设计与实现.docx

    蓝桥杯第十四届程序C组试题B自行整理(包括答案)

    主要对蓝桥杯第十四届程序C组试题B进行代码编写

    ASP.NET+SQL通用作业批改系统设计(源代码+论文).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    智能制造建模与仿真技术及其发展趋势

    本文详细介绍了智能制造领域里的建模与仿真技术的概念和特点,包括它们的基本定义、最新特点,如集成化、模块化、层次化、跨学科化、计算高速化以及人工智能化的趋势,并阐述了其关键技术,还提供了多个典型案例分析。另外,探讨了未来建模仿真技术在智能制造背景下的发展走向,特别是在实时仿真、云端建模与仿真和下一代数字模型方面的前景。 适用人群:智能制造相关的行业从业者、研究学者或者具有一定工程基础的学生。 使用场景及目标:适用于希望深入理解建模和仿真如何应用于智能生产的专业人士,并希望通过该领域的技术进步提升自己的业务水平和科研创新能力。 阅读推荐:此资源非常适合那些渴望获得有关智能制造中各种建模与仿真应用场景的知识的人群。它提供了从理论知识到实际工业项目的实例分析,涵盖了广泛的视角。

    EfficientFormer实战:使用EfficientFormerV2实现图像分类任务

    EfficientFormerV2是一种通过重新思考ViT设计选择和引入细粒度联合搜索策略而开发出的新型移动视觉骨干网络。它结合了卷积和变换器的优势,通过一系列高效的设计改进和搜索方法,实现了在移动设备上既轻又快且保持高性能的目标。这一成果为在资源受限的硬件上有效部署视觉变换器模型提供了新的思路 原文链接:https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/142367223

    一套通过人脸识别遗传病的机器学习系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    基于java的基于分类算法的学业警示预测系统设计与实现.docx

    基于java的基于分类算法的学业警示预测系统设计与实现.docx

    基于TensorRT实现轻量级语义分割的C++程序源码+文档说明+模型.zip

    基于TensorRT实现轻量级语义分割的C++程序源码+文档说明+模型.zip基于TensorRT实现轻量级语义分割的C++程序源码+文档说明+模型.zip基于TensorRT实现轻量级语义分割的C++程序源码+文档说明+模型.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。

    大数据之机器学习推荐系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

Global site tag (gtag.js) - Google Analytics