`
kisslongge
  • 浏览: 5071 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

springMVC 防止表单重复提交

阅读更多

原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。

新建注解:Token.java
package gov.saxmz.one.controller;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

    boolean save() default false;

    boolean remove() default false;
}


新建拦截器:TokenInterceptor.java
package gov.saxmz.one.controller;
import java.lang.reflect.Method;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

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.xml中配置 :

<!--拦截器配置-->
  <mvc:interceptors>
       <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="gov.saxmz.one.controller.TokenInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

在相关方法中加入注解:

在需要生成token的controller上增加@Token(save=true),而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。

在jsp页面中加入 :
   <input type="hidden" name="token" value="${token}">

分享到:
评论

相关推荐

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

    SpringMVC中基于Token防止表单重复提交方法 SpringMVC中基于Token防止表单重复提交方法是指通过在SpringMVC配置文件中添加拦截器配置,来拦截页面请求和表单提交请求,以防止表单重复提交。下面是该方法的实现思路...

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

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

    token-springMVC 防止重复提交

    总的来说,"Token-SpringMVC"是Spring MVC框架中防止重复提交的一种实用策略,它通过令牌验证确保了请求的唯一性,从而保护了系统的数据一致性。在实际开发中,我们需要根据项目需求和安全级别来选择合适的防止重复...

    springMVC自定义防重复提交

    - 在业务逻辑执行完毕后,需要清除session中的token,防止因为浏览器回退导致的重复提交。这通常在控制器方法的最后执行,或者在拦截器的`postHandle()`或`afterCompletion()`方法中完成。 5. **标签实现**: - ...

    Token验证表单重复提交

    在SSM(Spring、SpringMVC、MyBatis)开发框架中,结合注解和拦截器,可以有效地实现表单重复提交的验证。下面将详细介绍这个过程。 首先,我们需要理解什么是Token。Token是一种安全机制,它通常是一段随机生成的...

    springboot接管SpringMVC1

    在 WebMvcConfigurer 中,我们可以重写 addInterceptors 方法来添加拦截器,以防止表单重复提交。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void ...

    SpringMVC-02教案1

    常用于处理表单提交后的跳转,避免重复提交。 5. **响应JSON数据**: - **过滤静态资源**:SpringMVC的DispatcherServlet默认会拦截所有请求,包括静态资源(如图片、CSS、JavaScript)。为防止这种情况,可以在`...

    struts2,hibernate,spring,springmvc,mybatis

    国际化(i18n)则涉及如何支持多种语言,而防止重复提交是Web开发中的重要问题,Struts2提供了一种解决方案。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。`day57_hibernate_多...

    SpringMVC+jQuery(ajaxSubmit) 异步上传图片

    在实际应用中,我们还需要考虑安全性问题,如验证文件类型、大小以及防止重复上传。同时,为了提高用户体验,可以使用预览功能,让用户在上传前就能看到所选图片。 总结,SpringMVC结合jQuery的ajaxSubmit实现了...

    JAVA高并发高性能高可用高扩展架构视频教程

    Java-Base64算法_创新_防止表单重复提交 JAVA企业级基础课题(HashMap那些事) 企业架构师必备技能(JAVA核心技术反射) JavaWeb之基础(手写实现Tomcat服务器) java多线程编程 纯手写实现SpringIOC实现过程 JEE企业级...

    SpringMVC+++Mybatis 页面注册代码

    - 为了提高用户体验,可以使用SpringMVC的`@ExceptionHandler`处理注册过程中的异常,如数据重复、空指针异常等。 - 异常处理方法可以返回一个ModelAndView对象,将错误信息放入模型中,然后重定向回注册页面,...

    spring mvc 登陆验证

    登录成功后,可以使用RedirectAttributes进行重定向,以防止表单重复提交。 **8. CSRF防护** 为了增强安全性,还需要考虑跨站请求伪造(CSRF)攻击的防护。Spring Security默认提供了CSRF保护,可以通过配置关闭或...

    详解SpringMVC重定向传参数的实现

    总的来说,Spring MVC中的重定向和Flash Attributes机制为开发者提供了一种安全、方便的方式来处理表单提交和防止重复提交。通过正确使用`RedirectAttributes`和`addFlashAttribute`,可以在重定向过程中传递参数,...

    springmvc+mybatis

    MyBatis 提供了 SQL 映射功能,使得开发者可以直接编写 SQL 语句,避免了传统的 JDBC 编程中大量重复的代码。它允许开发者将 SQL 语句与 Java 代码分离,使得 SQL 语句更加易读、易维护。 - **XML 映射文件**:在...

    java常用框架学习笔记

    Struts2提供了防止表单重复提交的机制,可以通过令牌机制来实现。 ##### 9.11 Struts中Result标签 Struts2的`&lt;result&gt;`标签用于定义请求处理后的结果页面。 以上内容概述了Java开发中常用的几个框架的基本概念和...

    百度地图开发java源码-TypicalWebProject:一个典型的JavaWeb项目

    令牌机制防止表单重复提交。 注册表单的JS验证、Ajax用户名唯一性验证等等。 开发环境: jdk1.8+Tomcat 9+Mysql 5.7+Eclipse(本人用Oracle也做了一版,上传的程序是用的Mysql版) 项目功能模块: 用户注册、登录、...

    含文件操作的信息管理系统

    在本系统中,表单非空验证确保用户输入了所有必需的信息,而重复验证则防止了如用户名、邮箱等唯一标识符的冲突。SpringMVC提供了注解驱动的验证机制,如`@NotBlank`、`@Email`等,可以方便地在控制器方法参数上应用...

    SSM上传文件并重命名demo

    文件上传后,我们可能需要对文件进行重命名,以防止重复文件名或者安全考虑。可以使用`java.io.File`类的`renameTo()`方法进行重命名操作。重命名时应确保新文件名的唯一性和合法性,例如,可以添加时间戳或者随机...

    maven整合ssm,myeclipse,内含有mysql数据库

    4. **防止表单重复提交**:为了避免用户误操作或恶意多次提交表单,可以使用Spring MVC的拦截器或JavaScript来实现表单的防重提交机制。 5. **发送验证码**:通常用于增强账户安全性,例如在注册或找回密码时。...

    dingframework用户指南

    本文档将深入探讨dingframeworkMVC的核心概念、配置方法以及关键特性,包括HelloWorld示例、配置细节、文件上传处理、表单数据验证、国际化支持、拦截器机制以及防止重复提交等功能。 #### 一、dingframeworkMVC...

Global site tag (gtag.js) - Google Analytics