`

Spring MVC防重复提交

 
阅读更多
http://my.oschina.net/zyqjustin/blog/692789
如何在Spring MVC里面解决此问题(其它框架也一样,逻辑一样,思想一样,和具体框架没什么关系)。要解决重复提交,有很多办法,比如说在提交完成后redirect一下,也可以用本文提到的使用token的方法(我不使用redirect是因为那样解决不了ajax提交数据或者移动应用提交数据,另一个原因是现在比较通行的方法是使用token,像python里的django框架也是使用token来解决)。

使用token的逻辑是,给所有的url加一个拦截器,在拦截器里面用java的UUID生成一个随机的UUID并把这个UUID放到session里面,然后在浏览器做数据提交的时候将此UUID提交到服务器。服务器在接收到此UUID后,检查一下该UUID是否已经被提交,如果已经被提交,则不让逻辑继续执行下去…

好的,来点实际代码,也许实际代码才是最好的老师:

注解Token代码:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {

    boolean save() default false;

    boolean remove() default false;
}




拦截器TokenInterceptor代码:

public class TokenInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            Token annotation = method.getAnnotation(Token.class);
            if (annotation != null) {
                boolean needSaveSession = annotation.save();
                if (needSaveSession) {
                    request.getSession(false).setAttribute("token", UUID.randomUUID().toString());
                }
                boolean needRemoveSession = annotation.remove();
                if (needRemoveSession) {
                    if (isRepeatSubmit(request)) {
                        return false;
                    }
                    request.getSession(false).removeAttribute("token");
                }
            }
            return true;
        } else {
            return super.preHandle(request, response, handler);
        }
    }

    private boolean isRepeatSubmit(HttpServletRequest request) {
        String serverToken = (String) request.getSession(false).getAttribute("token");
        if (serverToken == null) {
            return true;
        }
        String clinetToken = request.getParameter("token");
        if (clinetToken == null) {
            return true;
        }
        if (!serverToken.equals(clinetToken)) {
            return true;
        }
        return false;
    }
}




然后在Spring MVC的配置文件里加入:注意,要在*-servlet。xml里面配置

    <!-- 拦截器配置 -->
    <mvc:interceptors>
        <!-- 配置Shiro拦截器,实现注册用户的注入 -->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.storezhang.video.shiro.ShiroInterceptor"/>
        </mvc:interceptor>
        <!-- 配置Token拦截器,防止用户重复提交数据 -->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.storezhang.web.spring.TokenInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

相关代码已经注释,相信你能看懂。


关于这个方法的用法是:在需要生成token的controller上增加@Token(save=true),而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。
另外,你需要在view里在form里增加下面代码:

<input type="hidden" name="token" value="${token}" />
分享到:
评论

相关推荐

    Spring mvc防止数据重复提交的方法

    主要为大家详细介绍了Spring mvc防止数据重复提交的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Spring MVC接口防数据篡改和重复提交

    主要为大家详细介绍了Spring MVC接口防数据篡改和重复提交,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    token-springMVC 防止重复提交

    token-springMVC 防止重复提交

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

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

    spring mvc 3.2 参考文档

    因此你不需要简单的重复拷贝您的业务对象的属性,表单对象中的非类型化的字符串只是处理无效的提交,或者合理的转换字符串。相反,直接绑定的方式更可取。 Spring的视图解析也非常灵活,控制器通常负责准备含有数据...

    springMVC中基于token防止表单重复提交方法

    本篇文章主要介绍了springMVC中基于token防止表单重复提交方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    035-prevent-duplicate-form-submission-spring-mvc

    035-防止重复表单提交-弹簧-MVC

    Spring面试题

    1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3....

    springboot参考指南

    关闭Spring MVC DispatcherServlet vii. 65.7. 关闭默认的MVC配置 Spring Boot参考指南 7 viii. 65.8. 自定义ViewResolvers v. 66. 日志 i. 66.1. 配置Logback ii. 66.2. 配置Log4j i. 66.2.1. 使用YAML或JSON配置...

    J2EE三大框架_笔记_a

    9-Struts高级部分(1)(解决重复提交、上传组件)笔记 10-Struts高级部分(2)(常用Action、验证框架、动态Form)笔记 J2EE框架_笔记_b: 11-留言管理程序_使用Struts + DAO完成笔记 12-Struts + DAO分页笔记 16-...

    往届师兄师姐面试真题收集(Java相关岗位)

    在spring mvc中如何实现 前后端数据的互通是通过Ajax+Json技术实现的。springmvc框架封装了原生mvc,视图层向业务层传递数据时需经过控制层。 4、单线程和多线程的区别 多线程即同时存在多个线程运行,比只有一个...

    J2EE框架_笔记_b

    9-Struts高级部分(1)(解决重复提交、上传组件)笔记 10-Struts高级部分(2)(常用Action、验证框架、动态Form)笔记 J2EE框架_笔记_b: 11-留言管理程序_使用Struts + DAO完成笔记 12-Struts + DAO分页笔记 16-...

    J2EE框架_笔记_c

    9-Struts高级部分(1)(解决重复提交、上传组件)笔记 10-Struts高级部分(2)(常用Action、验证框架、动态Form)笔记 J2EE框架_笔记_b: 11-留言管理程序_使用Struts + DAO完成笔记 12-Struts + DAO分页笔记 16-...

    template-collection:Java Web开发模板集合

    JAVA开发模板集合提供了一些在JAVA WEB开发中的开发案例.如有更好的建议,请在Issue / Pull Request提交,我会仔细阅读....使用Spring MVC和Javax Validation框架简化重复的参数校验代码,使用注解的方式比代码更加简化.

    javaEE框架笔记,识货人下

    1-JSP+JDBC_假分页笔记.pdf 10-Struts高级部分(2)(常用Action、验证框架、动态Form)笔记.pdf 11-留言管理程序_使用Struts + DAO完成笔记.pdf ...9-Struts高级部分(1)(解决重复提交、上传组件)笔记.pdf

    火炬博客系统7

    本系统还采用Struts的Token机制和JavaScript技术实现绝对安全的防重复提交功能。 21。文章管理。可修改、删除文章。 22。评论管理。可回复、删除评论。 23。相片管理。可上传相片,设置主肖像,删除...

    火炬博客系统6

    本系统还采用Struts的Token机制和JavaScript技术实现绝对安全的防重复提交功能。 21。文章管理。可修改、删除文章。 22。评论管理。可回复、删除评论。 23。相片管理。可上传相片,设置主肖像,删除...

    火炬博客系统5

    本系统还采用Struts的Token机制和JavaScript技术实现绝对安全的防重复提交功能。 21。文章管理。可修改、删除文章。 22。评论管理。可回复、删除评论。 23。相片管理。可上传相片,设置主肖像,删除...

    因酷时代(inxedu)在线教育系统源码 BecauseCoolTimesInlineEducation.rar

    视图框架—Spring MVC;持久层框架—MyBatis 3;JS框架—jQuery;富文本—kindeditor 5、开发环境:建议开发者使用以下环境,这样避免版本带来的问题 IDE:eclipse,idea;DB:Mysql5.5;JDK:JAVA 7;tomcat:tomcat ...

    SSH学习基础笔记 .zip

    1-JSP+JDBC_假分页笔记.pdf 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记.pdf 3-JSP+DAO和MVC+DAO(基于...9-Struts高级部分(1)(解决重复提交、上传组件)笔记.pdf 54留言管理程序_Struts + Spring + Hibernate笔记.pdf

Global site tag (gtag.js) - Google Analytics