Spring MVC表单防重复提交

利用Spring MVC的过滤器及token传递验证来实现表单防重复提交。

创建注解

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Token {

   boolean create() default false;

   boolean remove() default false;

}

在跳转页面的方法上加上:@Token(create = true)\

在提交的action方法上加上:@Token(remove = true)

创建过滤器

public class TokenInterceptor extends HandlerInterceptorAdapter {

   private Logger logger = Logger.getLogger(TokenInterceptor.class);

   private static final String TOKEN = "token";

   @Override

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

           Object handler) throws Exception {

       if (handler instanceof HandlerMethod) {

           Method method = ((HandlerMethod) handler).getMethod();

           Token annotation = method.getAnnotation(Token.class);

           if (annotation != null) {

               HttpSession session = request.getSession();

               // 创建token

               boolean create = annotation.create();

               if (create) {

                   session.setAttribute(TOKEN, UUID.randomUUID().toString());

                   return true;

               }

               // 删除token

               boolean remove = annotation.remove();

               if (remove) {

                   if (isRepeatSubmit(request)) {

                       logger.warn("表单不能重复提交:" + request.getRequestURL());

                       return false;

                   }

                   session.removeAttribute(TOKEN);

               }

           }

       } else {

           return super.preHandle(request, response, handler);

       }

       return true;

   }

   private boolean isRepeatSubmit(HttpServletRequest request) {

       String token = (String) request.getSession().getAttribute(TOKEN);

       if (token == null) {

           return true;

       }

       String reqToken = request.getParameter(TOKEN);

       if (reqToken == null) {

           return true;

       }

       if (!token.equals(reqToken)) {

           return true;

       }

       return false;

   }

}

配置拦截器

<!--配置拦截器 -->  

<mvc:interceptors>

   <mvc:interceptor>  

       <mvc:mapping path="/**" />

       <bean class="com.example.web.interceptor.TokenInterceptor"/>    

   </mvc:interceptor>

</mvc:interceptors>

表单添加token

<input type="hidden" id="token" name="token" value="$!{session.getAttribute('token')}"/>

在form表单里面添加token域,提交表单时需要传过去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容