博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springmvc防止重复提交拦截器
阅读量:6350 次
发布时间:2019-06-22

本文共 3726 字,大约阅读时间需要 12 分钟。

一、拦截器实现,ResubmitInterceptorHandler.java

import org.apache.commons.lang3.StringUtils;import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.lang.reflect.Method;import java.util.Arrays;import java.util.Map;import java.util.Set;/** * 重复请求阻止拦截器 */@Component("resubmitInterceptorHandler")public class ResubmitInterceptorHandler extends HandlerInterceptorAdapter {    private RedisUtils redisUtils;//自定义    public ResubmitInterceptorHandler(RedisUtils redisUtils) {        this.redisUtils = redisUtils;    }    /**     * 拦截重复提交的请求     *     * @param request     * @param response     * @param handler     * @return     * @throws Exception     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        HandlerMethod method = (HandlerMethod) handler;        Resubmit resubmit = method.getMethodAnnotation(Resubmit.class);        if (resubmit == null) {            return true;        } else {            Long seconds = resubmit.seconds();            // 获取重复提交的键值            String key = getKey(request, method);            String value = redisUtils.get(key, String.class);            if (StringUtils.isBlank(value)) {                // 如果存在就存储到redis中                redisUtils.set(key, seconds.toString(), seconds);                return true;            } else {                throw new Exception("请不要在" + seconds + "秒内重复请求");            }        }    }    /**     * 获取redis存储的键     *     * @param request     * @param method     * @return     */    private String getKey(HttpServletRequest request, HandlerMethod method) {        StringBuffer sb = new StringBuffer();        String requestURI = request.getRequestURI();        // 拼接请求路径        sb.append(requestURI);        Method targetMethod = method.getMethod();        // 拼接目标方法名称        sb.append(targetMethod.getName());        Map
parameterMap = request.getParameterMap(); if (parameterMap != null) { Set
> entries = parameterMap.entrySet(); if (entries != null) { for (Map.Entry
entry : entries) { sb.append(entry.getKey()).append(Arrays.toString(entry.getValue())); } } } return sb.toString(); }}

二、controller上要添加的注解

import java.lang.annotation.*;@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Resubmit {    long value() default 0;    /**     * 指定多少时间以内不能重复提交     * -1 表示不进行处理     *     * @return     */    long seconds();}

三、拦截器配置

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration@Import(com.bqmart.utils.RedisUtils.class)public class InterceptorConfig extends WebMvcConfigurerAdapter {    @Autowired    private xxx.RedisUtils redisUtils;    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(validateInterceptorHandler()).addPathPatterns("/**");    }    @Bean    public com.bqmart.interceptor.ResubmitInterceptorHandler resubmitInterceptorHandler() {        return new ResubmitInterceptorHandler(redisUtils);    }}

 

转载地址:http://yitla.baihongyu.com/

你可能感兴趣的文章
你还在看《深入理解Java虚拟机》的运行时数据模型吗?
查看>>
RIS,创建 React 应用的新选择
查看>>
线性结构上的动态规划--算法竞赛入门经典笔记
查看>>
面试官:你使用webpack时手写过loader,分离过模块吗?
查看>>
Ubuntu 16.04系统下 对OpenJDK编译好的Hotspot 进行调试
查看>>
00-利用思维导图梳理JavaSE基础知识-持续更新中!
查看>>
java中三种注释及其实际应用的意义
查看>>
Emacs 24.2 for Mac OS X 最新版的 MAC Emacs 安装包
查看>>
让龙芯小本真正发挥作用-用8089D打造自己的Github服务器
查看>>
【三石jQuery视频教程】01.图片循环展示
查看>>
ngrok
查看>>
ThinkPHP 模板变量输出
查看>>
android系统信息(内存、cpu、sd卡、电量、版本)获取
查看>>
HTML5、WebKit与移动应用开发
查看>>
面google的试题,对google面试题的衍生推导
查看>>
Eclipse Debug Android Native Application
查看>>
java动态代理
查看>>
node.js原型继承
查看>>
揭露让Linux与Windows隔阂消失的奥秘(1)
查看>>
我的友情链接
查看>>