一、拦截器实现,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<String, String[]> parameterMap = request.getParameterMap();
if (parameterMap != null) {
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
if (entries != null) {
for (Map.Entry<String, String[]> 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)
@Documented
public @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);
} }

springmvc防止重复提交拦截器的更多相关文章

  1. struts2 自带的 token防止表单重复提交拦截器

    在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name=&quo ...

  2. SpringMVC防止重复提交

    作者:mylovepan 推荐:GOODDEEP 问题描述: 现在的网站在注册步骤中,由于后台要处理大量信息,造成响应变慢(测试机器性能差也是造成变慢的一个因素),在前端页面提交信息之前,等待后端响应 ...

  3. 基于Springmvc的登录权限拦截器

    1.什么是拦截器 拦截器是指通过统一拦截从浏览器发往服务端的请求来完成功能的增强. 使用场景:解决请求的共性问题(如:乱码问题,权限验证问题等) 2.拦截器的基本工作原理 springmvc可以通过配 ...

  4. SpringMVC学习笔记九:拦截器及拦截器的简单实用

    SpringMVC中的interceptor拦截器是非常重要的,它的主要作用就是拦截指定的用户请求,并进行相应的预处理和后处理. 拦截时间点在"处理器映射器根据用户提交的请求映射出所要执行的 ...

  5. 【SpringMVC】 4.3 拦截器

    SpringMVC学习记录 注意:以下内容是学习 北京动力节点 的SpringMVC视频后所记录的笔记.源码以及个人的理解等,记录下来仅供学习 第4章 SpringMVC 核心技术 4.3 拦截器   ...

  6. SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  7. SpringMVC 中的Interceptor 拦截器

    1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors>  <!-- 日志拦截器 -->  <mvc:interceptor> ...

  8. SpringMVC中使用Interceptor拦截器顺序

    一.简介 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验 证,或者是来判断用户是否登陆,或者是像1 ...

  9. java框架之SpringMVC(2)-补充及拦截器

    高级参数绑定 package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; i ...

随机推荐

  1. dwr网上使用例子

    转: dwr实现聊天室功能 2016年01月15日 10:22:43 我爱喝可乐 阅读数:564   用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无 ...

  2. Apache 与 Tomcat 整合

    目标 1.同一台机器上,不同的域名指向,访问不同的项目,即: (1)one.test.com 访问 project_one (2) two.test.com 访问 project_two   2.将T ...

  3. Kafka 0.8 sever:源代码High level分析

    本文主要介绍了Kafka High level的代码架构和主要的类. 这张图是0.8版本的架构 Boker 架构 1 network layer Kafka使用NIO自己实现了网络层的代码, 而不是采 ...

  4. vue ssr服务端渲染

    SSR:Server Side Rendering(服务端渲染) 目的是为了解决单页面应用的 SEO 的问题,对于一般网站影响不大,但是对于论坛类,内容类网站来说是致命的,搜索引擎无法抓取页面相关内容 ...

  5. python 喜马拉雅 音乐下载 演示代码

    1.主程序文件 import os import json import requests from contextlib import closing from progressbar import ...

  6. html5 canvas 垂直渐变描边

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. [百度地图] 用于类似 DWZ UI 框架的 百度地图 功能封装类 [MultiZMap.js] 实例源码

    MultiZMap 功能说明 MultiZMap.js 本类方法功能大多使用 prototype 原型 实现,它是 ZMap 的多加载版本,主要用于类似 DWZ 这个 多标签的 UI 的框架: 包含的 ...

  8. Flex 界面初始化 自定义 预加载 类!

    说明: 自定义界面初始化过程提示:初始化...,初始化完毕,加载完毕! ZPreloader.as package com.command { import flash.display.Graphic ...

  9. BFS的队列

    按老师上课的话来总结,队列变化多端:   普通模板没有代价: 普通队列FIFO 01代价: 双端队列,单调队列 任意代价: 优先队列/堆,最短路SPFA/DIJKSTRA

  10. vb 中recordset提示对象关闭时不允许操作

    vb中执行查询后,一般要判断是否为空,只要执行的查询执行了select,都可以用rs.eof 或者 rs.recordcount来判断, 但是,如果执行的sql中加了逻辑判断,导致没有执行任何sele ...