zoukankan      html  css  js  c++  java
  • SpringMVC防止表单重复提交

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

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

    首先创建注解token:

    @Target(ElementType.METHOD)//设置注解的可用范围-这里是方法上
    @Retention(RetentionPolicy.RUNTIME)//设置注解的作用范围
    public @interface Token {
    
    boolean save() default false;
    
    boolean remove() default false;
    }

    创建token拦截器:

     1 public class TokenInterceptor extends HandlerInterceptorAdapter {
     2 
     3   @Override
     4   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     5         if (handler instanceof HandlerMethod) {
     6             HandlerMethod handlerMethod = (HandlerMethod) handler;
     7             Method method = handlerMethod.getMethod();
     8 
     9         Token annotation = method.getAnnotation(Token.class);
    10         if (annotation != null) {
    11           boolean needSaveSession = annotation.save();
    12          if (needSaveSession) {
    13             request.getSession(false).setAttribute("token", UUID.randomUUID().toString());
    14 
    15          }
    16          boolean needRemoveSession = annotation.remove();
    17          if (needRemoveSession) {
    18            if (isRepeatSubmit(request)) {
    19              return false;
    20            }
    21            request.getSession(false).removeAttribute("token");
    22            }
    23      }
    24       return true;
    25      } else {
    26       return super.preHandle(request, response, handler);
    27      }
    28   }
    29 
    30   private boolean isRepeatSubmit(HttpServletRequest request) {
    31     String serverToken = (String) request.getSession(false).getAttribute("token");
    32     if (serverToken == null) {
    33       return true;
    34     }
    35     String clinetToken = request.getParameter("token");
    36     if (clinetToken == null) {
    37       return true;
    38     }
    39     if (!serverToken.equals(clinetToken)) {
    40       return true;
    41     }
    42       return false;
    43   }
    44 }

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

     1 <bean
     2 class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />这个默认的会找不到方法处理器
     3 
     4   
     5 
     6 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
     7   <property name="interceptors">
     8     <list>
     9       <bean class="com.rbao.east.interceptor.TokenInterceptor"/>
    10     </list>
    11   </property>
    12 </bean>
    13 <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

    结合

    Spring太'激情'了.有好的文章希望能推荐推荐

    如果有什么好的方案,希望各位朋友推荐推荐相互学习,多谢~~~

  • 相关阅读:
    .net制作安装程序总结 dodo
    部署ASP.NET(包含.net framework 和MDAC) dodo
    (转).Net应用程序发布的解决方案[最新整理](可加桌面快捷、在程序中加自己的ICO及自动卸载等) dodo
    Eric的日期选择下拉列表小控件 dodo
    如何通过需要验证的邮件服务器发送邮件? dodo
    异常详细信息: System.Security.SecurityException: 不允许所请求的注册表访问权 dodo
    登陆模块防止恶意用户SQL注入攻击 dodo
    C#插入记录时单引号的处理 dodo
    System.Configuration命名空间下找不到ConfigurationManager类 dodo
    常用的.net日期控件 dodo
  • 原文地址:https://www.cnblogs.com/cunkouzh/p/4767135.html
Copyright © 2011-2022 走看看