SpringBoot中如何在过滤器中取post的参数值

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

写在前面

我们在上篇文章中说到了如何在过滤器中取get请求的参数值,也给出了一些方法的应用示例,大家如果感兴趣,可以看一下。

SpringBoot中如何在过滤器中取get的参数值

今天我们要来学习的也是同样的系列,那就是如何在过滤器中取post请求的参数值。

应用场景

如果获取到post请求的参数,我们一般都在过滤器,或者是拦截器,甚至解析器中想要修改相关的参数,或者是在原来的基础上增加一些参数的话。

那么现在我们就要用到接下来的解决方案了,一起来看一下吧。

解决方案

我们一般都是通过继承HttpServletRequestWrapper类,来实现具体的参数处理方法。

假设我们现在要在过滤器中获取post请求的数据。

首先要创建一个RequestWrapper.java类,下面我们就直接先贴一下代码了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
java复制代码@Data
public class RequestWrapper extends HttpServletRequestWrapper {

private byte[] body;

public RequestWrapper(HttpServletRequest request) throws IOException {
super(request);
body = this.toByteArray(request.getInputStream());
}

private byte[] toByteArray(ServletInputStream inputStream) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int n = 0;
while ((n = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
return out.toByteArray();
}

@Override
public BufferedReader getReader() {
return new BufferedReader(new InputStreamReader(getInputStream()));
}

@Override
public ServletInputStream getInputStream() {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() {
return byteArrayInputStream.read();
}
};
}
}

上述类中,继承了HttpServletRequestWrapper类,继承重写了父类的getReader、getInputStream方法,其实我们从字面意思上来看也能看出来相关的意思。

getReader():读取数据并返回一个BufferReader类。

getInputStream():获取文件输入流。

有了这个类,我们就可以将Post请求的参数值成功的拿出来了,让我们且接着看。

在过滤器的方法中,我们能拿到request对象,所以我们就不贴出太多代码了,只跟大家说一下重点代码。

1
2
3
ini复制代码RequestWrapper requestWrapper = new RequestWrapper(req);
byte[] bytes = requestWrapper.getBody();
Map<String, String> map = ByteUtils.changeByteToMap(bytes);

我这里使用了一个工具类,之后也和大家分享一下哈,本篇文章里就不赘述了,大家赶紧去试试吧。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%