首页 / 知识
SpringBoot:基于redis自定义注解实现后端接口防重复提交校验
2023-04-11 16:24:00

SpringBoot:基于redis自定义注解实现后端接口防重复提交校验
一、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
二、代码实现
1.构建可重复读取inputStream的request
package com.hl.springbootrepetitionsubmit.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* 构建可重复读取inputStream的request
*/
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {
private final String body;
public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException {
super(request);
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
body = getBodyString(request);
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
public String getBody() {
return body;
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
@Override
public int available() throws IOException {
return body.length();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
/**
* 获取Request请求body内容
*
* @param request
* @return
*/
private String getBodyString(ServletRequest request) {
StringBuilder sb = new StringBuilder();
BufferedReader reader = null;
try (InputStream inputStream = request.getInputStream()) {
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
2.重写request
package com.hl.springbootrepetitionsubmit.filter;
import com.hl.springbootrepetitionsubmit.servlet.RepeatedlyRequestWrapper;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* 过滤器(重写request)
*/
public class RepeatableFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
ServletRequest requestWrapper = null;
//将原生的request变为可重复读取inputStream的request
if (request instanceof HttpServletRequest
&& StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) {
requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
}
if (null == requestWrapper) {
chain.doFilter(request, response);
} else {
chain.doFilter(requestWrapper, response);
}
}
}
|
最新内容
相关内容
Python元类之通过元类实现数据库OR
Python元类之通过元类实现数据库ORM框架,数据,名称,信息,代码,主体,当中,字段,分析,一致,投入,ORM框架是什么如果是没有做过后端的小伙伴上来python操作系统接口模块:OS
python操作系统接口模块:OS,管理,工作,工具,系统,服务,培训,模块,文件,目录,函数,OS模块提供了很多与操作系统进行交互的函数,比如常见的使用函python实现报表用什么?
python实现报表用什么?,工具,工作,培训,报表,内容,参数,语言,终端,矩阵,语句,python中可以使用xlwt与xlrd库读写Excel报表。xlwtPython语言中python如何实现换行?
python如何实现换行?,培训,结果,字符,以上,方法,更多,内容,python实现换行的方法:1、使用换行符“\n”实现换行#-*-coding:utf-8-*-A="来Python如何实现excel筛选
Python如何实现excel筛选,数据,培训,表示,缺失,表格,示例,模块,手工,以上,标签,python实现筛选Excel数据可以使用pandas库来实现,具体的使用示python如何实现手动输入文字
python如何实现手动输入文字,培训,表达式,字符串,函数,整数,示例,语法,以上,参数,文字,python中可以使用input()函数接收用户输入的文字。函python中如何实现加密
python中如何实现加密,中国,数据,培训,信息,模块,你好,参数,字符串,长度,前后,1、Python中使用Base64加密:Python内置的base64模块可以直接进cmd无法实现启动python怎么办?
cmd无法实现启动python怎么办?,系统,培训,电脑,环境变量,变量,方法,问题,引号,结尾,属性,cmd无法实现启动python,原因是环境变量的问题。设置环Python如何实现自加
Python如何实现自加,代码,名称,数字,培训,观察,变量,内容,基准,示例,以上,先来看一段python代码,如下:代码示例:>>>i=1>>>++i>>>printi1[python用python怎么实现判断素数
用python怎么实现判断素数,数字,代码,情况,培训,质数,素数,自然数,不是,循环体,用户,python质数(Primenumber),又称素数,指在大于1的自然数中,除python怎样注解一段
python怎样注解一段,培训,注释,内容,注解,结尾,开头,全部,语法,以上,程序,python注解一段的方法:多行注释指的是可以一次性注释程序中多行的python的for循环如何实现
python的for循环如何实现,培训,变量,阶乘,对象,范围,方法,赋值,语法,元素,格式,python的for循环实现的方法:for循环专门用于遍历范围、列表、