`

spring mvc重复提交拦截器方法

阅读更多

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
 * 禁止表单重复提交拦截器
 *
 * */
public class DenyDuplicateFormSubmitInterceptor extends HandlerInterceptorAdapter {
    private FormManager formManager;
    
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        boolean flag = true;
        String token = request.getParameter(Form.FORM_UNIQ_ID_FIELD_NAME);
        if (token != null) {
            if (formManager.hasForm(request, token)) {
                formManager.destroyToken(request, token);
            } else {
                flag = false;
                throw new Exception("表单重复提交或过期,令牌[" + token + "]");
            }
        }
        return flag;
    }
    public void setFormManager(FormManager formManager) {
        this.formManager = formManager;
    }
}

在Spring MVC的HandlerMapping中配置该拦截器,随后在需要表单验证的Controller里做如下修改:

1、注入FormManager实例,主要是用newForm()生成一个新的Form对象

2、在返回的ModelAndView里加入该Form对象,假设名称是form

3、页面的表单中加入如下隐藏域

<input type="hidden" value="${form.token}" name="_form_uniq_id" />  
<input type="hidden" value="${form.token}" name="_form_uniq_id" />

代码中我去掉了些东西,应该还是能正常工作的,反正原理就是这么回事,呵呵。

抱歉打扰一下,我想说的是:
第二.你不必加同步锁,Session每个线程各有一份
第三.Map的value目的只是为了提供date,好替除最久未使用的token,但你不必for循环每一项吧,token每次put到map是经过你的代码的对吗?那么你很轻松就可记录下put的顺序。还好这个map不太大,但是你的设计可以更好的啊。

建议:把map打散,LinkedList记录顺序,HashSet快速contain到key。
TreeMap按date排序,基本上能解决这个问题


 

 

Spring MVC如何防止重复提交?类似Struts Token机制!
2007-03-01 18:32

首先,需要将继承了SimpleFormController之类的sessionForm设为true。这样,在显示一个新表单时,Spring会将command存放在session中,而在提交表单时,Spring会从session中取出此command,随后立即从session中删除存放command的attribute。如果发现在session中没有command,Spring将其断定为重复提交,转而执行handleInvalidSubmit(request, response),可覆盖此方法负责防止重复提交的任务。可以这么说,当setSessionForm(true)之后,如果没有先后经历显示表单、提交表单的过程,就会被认为是重复提交表单。而有一些情况下却必须重复提交表单,如,修改数据库的数据后,试图写入数据库时因某些异常失败,如果此时异常被当前页面捕获并依旧返回当前页面,由于command已经被Spring在后台从session中移走,因此,就被认为是无效重复提交,从而导致第二次经修改后的记录无法正确提交到数据库中。handleInvalidSubmit()必须考虑到这种情况。

-------------------------------------------------------------------------------------------------

方法2

楼上提供的方法比较麻烦。
我在项目中使用过一种比较简单的方法,就是使用一个Filter,设置request的参数,使禁止Browser对页面进行缓存

0
2
分享到:
评论
5 楼 jinnianshilongnian 2012-11-03  
a52071453 写道
jinnianshilongnian 写道
1、Spring3.1的新的Flash Attributes(类似于2)
2、你说的token机制
3、重定向

其实就是SESSION 和 REQ 参数对比!其实重定向可以解决 重复提交 解决不了重复刷新

是的, 所以我一般使用3
4 楼 a52071453 2012-11-02  
次生成token
freezingsky 写道
token,用中文的说法,可以叫令牌。保证每一次的请求都是不同的令牌。在不采用任何框架的情况下,可以这简单的描述。在客户端,通过隐藏域安放一个token值,每次生成token值时,服务器端可以判断cache(自定义的缓存)中是否已经有一个值一样的token,有就认为重复提交,没有就认为是第一次提交,然后cache进去。
个人浅见!


对 必有有一个隐藏hidden 判断是不是前一个页面走过来的
3 楼 a52071453 2012-11-02  
jinnianshilongnian 写道
1、Spring3.1的新的Flash Attributes(类似于2)
2、你说的token机制
3、重定向

其实就是SESSION 和 REQ 参数对比!其实重定向可以解决 重复提交 解决不了重复刷新
2 楼 jinnianshilongnian 2012-10-31  
1、Spring3.1的新的Flash Attributes(类似于2)
2、你说的token机制
3、重定向
1 楼 freezingsky 2012-10-31  
token,用中文的说法,可以叫令牌。保证每一次的请求都是不同的令牌。在不采用任何框架的情况下,可以这简单的描述。在客户端,通过隐藏域安放一个token值,每次生成token值时,服务器端可以判断cache(自定义的缓存)中是否已经有一个值一样的token,有就认为重复提交,没有就认为是第一次提交,然后cache进去。
个人浅见!

相关推荐

    Spring MVC 拦截器

    Spring MVC 拦截器Spring MVC 拦截器

    spring MVC(新增拦截器demo)

    这一版本的项目中新增了拦截器的一个demo

    Spring MVC入门教程

    九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? ...

    Spring MVC 教程 快速入门 深入分析

    九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? ...

    Spring MVC--13.自定义拦截器

    Spring MVC--自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器

    spring mvc拦截器过滤json中的null值

    spring mvc拦截器,过滤json数据中的null值,将null变成空字符串,内含截图,及jar包

    SpringMVC框架架构介绍

    九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? ...

    spring mvc 拦截器获取请求数据信息.rar

    spring mvc 拦截器获取请求数据信息 解压之后放到项目中 直接运行就可以了 (将流多次运用)

    spring mvc 中 实现自定义注解 拦截需要的方法

    网上很多人想使用注解拦截spring mvc action中的一个方法,实现方法很多,一般是通过在拦截器中分析url路径来实现, 使用自定义注解的方式来标注要拦截的 action 中的某个方法, 没有很好的解决方法, 如果通过借助spring...

    拦截器spring mvc

    拦截器spring mvc,非常经典,非常容易理解,结合例子。官方推荐

    Spring MVC 拦截器入门例子

    拦截器是Spring MVC中一个十分重要且应用广泛的内容。这里简单敲了一个简单的例子,简单易懂

    spring mvc xml配置拦截器

    NULL 博文链接:https://hw1287789687.iteye.com/blog/2046621

    Spring MVC+MyBatis开发从入门到项目实战

    包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和拦截器的讲解。第4篇是Spring MVC...

    SpringMVCDemo:Spring MVC 框架知识案例

    1.创建第一个 Spring MVC 程序案例 2.Spring MVC @RequestMapping 注解案例 3.Spring MVC 请求参数的获取案例 4.Spring MVC 域对象共享数据案例 ...14.Spring MVC 拦截器案例 15.Spring MVC 异常处理案例

    详解Spring MVC拦截器实现session控制

    主要介绍了详解Spring MVC拦截器实现session控制,使用session监听,重复登录后,强制之前登录的session过期。有兴趣的可以了解一下。

    Spring Boot mvc web拦截器实现权限访问控制等功能(csdn)————程序.pdf

    Spring Boot mvc web拦截器实现权限访问控制等功能(csdn)————程序

    Spring MVC依赖包

    Spring mvc依赖包 Spring mvc都做了些什么 Controller为中心完成对系统流程的控制管理 从请求中搜集数据 对传入的参数进行验证 将结果返回给视图 针对不同的视图提供不同的解决方案 ...拦截器 上传文件

    基于java的企业级应用开发:拦截器.ppt

    15.1 拦截器概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 ...

Global site tag (gtag.js) - Google Analytics