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

网友投稿 510 2022-11-20


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

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

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

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

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

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

解决方法 :

1、自定义一个类 BodyReaderHttpServletRequestWrapper.java

import java.io.BufferedReader;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import javax.servlet.RePVRxalYbZhadListener;

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 1PVRxalYbZh0: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

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.ouPVRxalYbZht.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配置过滤器

test2

com.zhhy.hy2000interface.utils.filter.MyFilter

test2

/*

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Eclipse git推送上传错误问题解决方案
下一篇:SpringBoot后端接口的实现(看这一篇就够了)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~