解决spring 处理request.getInputStream()输入流只能读取一次问题

2025-05-29 0 29

一般我们会在InterceptorAdapter拦截器中对请求进行验证

正常普通接口请求,request.getParameter()可以获取,能多次读取

如果我们的接口是用@RequestBody来接受数据,那么我们在拦截器中

需要读取request的输入流 ,因为 ServletRequest中getReader()和getInputStream()只能调用一次

这样就会导致controller 无法拿到数据。

解决方法 :

1、自定义一个类 BodyReaderHttpServletRequestWrapper.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

48

49

50

51

52

53

54

55

56

57

58

59

60
import java.io.BufferedReader;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import javax.servlet.ReadListener;

import javax.servlet.ServletInputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

import org.springframework.util.StreamUtils;

/**

* @author WBG

* @date 2020/6/22 10:42

* @describe

*/

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper{

private byte[] requestBody = null;//用于将流保存下来

public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {

super(request);

requestBody = StreamUtils.copyToByteArray(request.getInputStream());

}

@Override

public ServletInputStream getInputStream() throws IOException {

final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);

return new ServletInputStream() {

@Override

public int read() throws IOException {

return bais.read();

}

@Override

public boolean isFinished() {

return false;

}

@Override

public boolean isReady() {

return false;

}

@Override

public void setReadListener(ReadListener readListener) {

}

};

}

@Override

public BufferedReader getReader() throws IOException{

return new BufferedReader(new InputStreamReader(getInputStream()));

}

}

2、自定义 MyFilter 继承Filter

?

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

48

49

50

51

52

53

54

55

56

57

58

59

60
import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import java.io.BufferedReader;

import java.io.IOException;

/**

* @author WBG

* @date 2020/6/22 14:32

* @describe

*/

public class MyFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("开始");

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

ServletRequest requestWrapper=null;

if(request instanceof HttpServletRequest) {

requestWrapper=new BodyReaderHttpServletRequestWrapper((HttpServletRequest)request);

}

if(requestWrapper==null) {

chain.doFilter(request, response);

}else {

System.out.println("------------------------------请求报文----------------------------------");

System.out.println(getParamsFromRequestBody((HttpServletRequest) requestWrapper));

System.out.println("------------------------------请求报文----------------------------------");

chain.doFilter(requestWrapper, response);

}

}

/* *

* 获取请求体内容

* @return

* @throws IOException

*/

private String getParamsFromRequestBody(HttpServletRequest request) throws IOException {

BufferedReader br = null;

String listString = "";

try {

br = request.getReader();

String str = "";

while ((str = br.readLine()) != null) {

listString += str;

}

} catch (IOException e) {

e.printStackTrace();

}

return listString;

}

@Override

public void destroy() {

System.out.println("destroy");

}

}

3、web.xm配置过滤器

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
<!--定义过滤器-->

<filter>

<!--定义过滤器拦截URL地址-->

<filter-name>test2</filter-name>

<!--过滤器的文件-->

<filter-class>com.zhhy.hy2000interface.utils.filter.MyFilter</filter-class>

</filter>

<filter-mapping>

<!--过滤器的名称-->

<filter-name>test2</filter-name>

<!--过滤器负责拦截的URL-->

<!-- /* 会把所有的请求拦截下来 -->

<url-pattern>/*</url-pattern>

</filter-mapping>

(如果是Springboot,使用注解即可)

解决spring 处理request.getInputStream()输入流只能读取一次问题

以上这篇解决spring 处理request.getInputStream()输入流只能读取一次问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

原文链接:https://www.cnblogs.com/weibanggang/p/13180469.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 解决spring 处理request.getInputStream()输入流只能读取一次问题 https://www.kuaiidc.com/116947.html

相关文章

发表评论
暂无评论