SpringMVC表当重复提交

最近公司上线,有同志进行攻击,表当防重复提交也没有弄,交给我 ,本人以前也没弄过,知道大概的思路,但是那样实在是太麻烦了,虽然后面试过使用过滤器加拦截器实现,不过还是有点小麻烦。

后来在网上搜索后发现不错的方案如下:注解加拦截器完成

首先创建注解token:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)设置注解的作用范围
public @interface Token {

boolean save() default false;

boolean remove() default false;
}

创建token拦截器:

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;
  }
}

然后在配置文件中配置好拦截器:注意这种方式在配置注解的处理器的时候需要配置:请求映射的方法处理器以及请求映射处理的适配器,如果使用

<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />这个默认的会找不到方法处理器

  

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
  <property name="interceptors">
    <list>
      <bean class="com.rbao.east.interceptor.TokenInterceptor"/>
    </list>
  </property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

然后在需要生成token的方法上面添加@Token(save = true)

需要进行校验的方法上添加@Token(remove = true)

最后在显示页面上添加隐藏字段<input type="hidden" name="token" value="${token}" />

本文来自:

http://blog.icoolxue.com/submitted-by-spring-mvc-to-prevent-data-duplication/

以及

http://chenzhou123520.iteye.com/blog/1702563

时间: 2024-11-16 06:39:34

SpringMVC表当重复提交的相关文章

Servlet、SPringMVC、Struts等防止表单重复提交的多种处理方法

第一种处理方法(非拦截器): 目前这种方法不建议,因为JSP规范不建议写JAVA代码.这种可以方便第二种处理方法的理解,第二种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机制. 1.在需要防止重复的jsp中加入下面的java代码, <%@page import="java.util.Random"%> <%@page import="java.util.Set"%> <%@page import="java

表单重复提交问题

一.常见的重复提交问题  a>点击提交按钮两次.  b>点击刷新按钮.  c>使用浏览器后退按钮重复之前的操作,导致重复提交表单.  d>使用浏览器历史记录重复提交表单.  e>浏览器重复的HTTP请求. 二.防止表单重复提交原理 提交表单的时候提交一份随机的字符串或随机数字等等,再把这个随机的数据存到request里面,然后把表单数据提交,在后台验证的时候判断提交的这两份额外的数据是否一致,如果一致,则把其中一份删除掉,这么做的目的是防止再次提交,继续进行操作,如果不一致,

防止表单重复提交

客户端防止表单重复提交: 不足之处:用户单击”刷新”,或单击”后退”再次提交表单,将导致表单重复提交 <script type="text/javascript"> //方式一 var iscommitted = false; function dosubmit(){ if(!iscommitted){ iscommitted = true; return true; }else{ return false; } } //方式二 function dosubmit(){ d

[原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

php 解决和避免form表单重复提交的方法

在提交表单的时候,可能遇到网速等导致页面突然加载变慢,用户重复地点击提交按钮,将在数据库产生多条数据,导致不可控情况. 比如下面的情况就会导致表单重复提交: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. 使用浏览器历史记录重复提交表单. 浏览器重复的HTTP请求. 网页被恶意刷新. 下面是几种解决的方法: 一:利用js设置按钮点击后变成灰色 $(document).ready(function(){ $(input:submit).click(){ s

[PHP]防止表单重复提交的几种方法

--------------------------------------------------------------------------------------------------- 1. 使用JS让按钮在点击一次后禁用(disable).=> 防止多次点击发生,实现方式较简单. 缺点:若客户端禁止JavaScript脚本,则失效. 2. 在提交成功后执行页面重定向(redirect).=> 转到提交成功信息页面. 特点:避免F5重复提交,消除浏览器前进和后退按导致的同样问题.

表单重复提交--笔记

同一个表单中的内容多次提交到服务器中. 第一种情况:    提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次.    - 这种情况产生的根本原因是,Servlet处理完请求以后,直接转发到目标页面.    - 这样整一个业务,只发送了一次请求,那么当你在浏览器中点击刷新按钮或者狂按f5会一直都会刷新之前的请求 解决方案:     使用重定向跳转到目标页面 第二种情况:    在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交.    - 产生的原因:是

form表单重复提交问题

导致表单重复提交的原因是:第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其他页面时才消失.在自调用返回时,内存中的数据依然在,这时页面中的判断提交的代码依然可以检测到提交的值,顾会产生重复提交的效果. 解决方法 Ⅰ重定向,页面提交后转到另一个页面而不是本页面 Ⅱ提交表单后提交按钮变灰/隐藏提交按钮 Ⅲ增加令牌token 访问页面前产生token public void toStart(HttpServletRequest req, HttpServletResponse re

如何防止表单重复提交

一.有很多的应用场景都会遇到重复提交问题,比如: 1.点击提交按钮两次.2.点击刷新按钮.3.使用浏览器后退按钮重复之前的操作,导致重复提交表单.4.使用浏览器历史记录重复提交表单.5.浏览器重复的 HTTP 请求. 二.防止表单重复提交的方法 1.禁掉提交按钮 表单提交后使用 Javascript 使提交按钮disable.这种方法防止心急的用户多次点击按钮.但有个问题,如果客户端把 Javascript 给禁止掉,这种方法就无效了. 2.Post/Redirect/Get 模式 在提交后执行