springmvc防止重复提交拦截器

时间:2021-09-04 03:38:44

一、拦截器实现,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学习笔记九&colon;拦截器及拦截器的简单实用

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

  5. 【SpringMVC】 4&period;3 拦截器

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

  6. SpringMVC中使用Interceptor拦截器

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

  7. SpringMVC 中的Interceptor 拦截器

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

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

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

  9. java框架之SpringMVC&lpar;2&rpar;-补充及拦截器

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

随机推荐

  1. python处理命令行参数

    直接从命令行执行py文件的时候如果带有参数,如何获取这些参数,如何解析? http://blog.chinaunix.net/uid-20786165-id-3182268.html sys.argv ...

  2. jquery-自适应全屏背景轮播动画

    实时自适应浏览器窗口大小的全屏背景轮播动画 <!DOCTYPE html> <html> <head> <meta http-equiv="Cont ...

  3. 【转】google play上传应用

    原文网址:https://support.google.com/googleplay/android-developer/answer/113469?hl=zh-Hans 注册 Google Play ...

  4. 【Java咬文嚼字】关键字&lpar;一&rpar;&colon;super和this

    这段时间一直在学Java,看了辣么多书以及博客,心痒也是着写写自己的学习心得. 这也算是新手篇:咬文嚼字Java中的关键字. 以关键字为第一篇博文也是考虑再三:1.本人基础也是薄弱 2.集跬步至千里 ...

  5. MySQL的保留字查询

    ADD ALL ALTER ANALYZE AND AS ASC AUTO_INCREMENT BDB BEFORE BERKELEYDB BETWEEN BIGINT BINARY BLOB BOT ...

  6. 获取IE浏览器关闭事件

    //关闭浏览器时才会触发此操作,刷新页面不执行 //n 检测鼠标相对于用户屏幕的水平位置 - 网页正文部分左:求出鼠标在当前窗口上的水平位置(参照:当前窗口右上角为0.0坐标) //m 网页正文全文宽 ...

  7. EF 传递的主键值的数量必须与实体上定义的主键值的数量匹配 原因

    主要是该数据表没有定义主键造成的

  8. python要开始记录了20181125

    print('1.使用while循环输入 1 2 3 4 5 6 8 9 10') i = 1 while i < 10: i += 1 if i == 7: continue #print(' ...

  9. Python Day 5

    阅读目录: 数字类型: 字符串类型: 列表类型: 可变与不可变类型: ##数字类型: # 了了解:py2中小整数用int存放,大整数用long # 1.整型 num = -10000000000000 ...

  10. IntelliJ IDEA 启动tomcat服务器报Error running &&num;39&semi;Unnamed&&num;39&semi;&colon; Address localhost&colon;1099 is already in use错误的问题

    在使用Intellij IDEA运行web项目时,出现 :Error running Tomcat8: Address localhost:1099 is already in use,使其web项目 ...