• 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太'激情'了.有好的文章希望能推荐推荐

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

  • 相关阅读:
    Q群
    shell脚本写host类型executable
    Oracle EBS 基于Host(主机文件)并发程序的开发
    ORALCE存储之ROWID
    HOW TO LINK THE TRANSACTION_SOURCE_ID TO TRANSACTION_SOURCE_TYPE_ID
    查找Form文件
    ORACLE column_type_id与实际type的对应关系
    OAF jar包引用产生错误
    计算Trial Balance的新方法(转)
    如何访问到XtreemHost上的站点?
  • 原文地址:https://www.cnblogs.com/cunkouzh/p/4767135.html
Copyright © 2020-2023  润新知