Request Payload 后台拦截器读取入参方式

1:具体步骤 写个类继承HttpServletRequestWrapper  ( 读取流---将读出的流数据重新写入到流里 ---重写getReader读出流--写个getbody将变量读出)

  这样流里有数据  ,变量也有数据 

 

 

2:下面是完整代码

package org.gocom.components.coframe.auth.intercepter;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 1 通过构造方法将流里的内容读出 赋值给变量 body
* 2: 重写父类的getInputStream()方法 , 将读出的数据重新写入到流里
* 3: 重写父类 getReader() 读出流里的数据
* 4: 写个getbody方法将变量body返回出去
* 通过上面3步 , 将流里的数据读出赋值给了变量body , 又将数据写入到流里
* 在拦截器里面生成的HttpServletRequest里面流里有数据 ,变量body也有数据 , 
*
*/
public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {

public String body;


//通过构造方法读取出流的内容
public MultiReadHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
StringBuffer sBuffer = new StringBuffer();
BufferedReader bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
sBuffer.append(line);
}
body = sBuffer.toString();

}
//重写父类 getInputStream方法 ,将读取的内容重新写入流,这步主要是将读出的数据重新写入到流中 , 不然 其他地方是获取不到的
@Override
public ServletInputStream getInputStream() {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
return new ServletInputStream() {
@Override
public int read() {
return byteArrayInputStream.read();
}
};
}
//重写 getReader 方法将重写的流的内容读出,  框架读取request里的值有一些用的这个方法,

//这里重写了这个方法后,框架里引用这个方法的地方不受影响,不然就是有的接口 获取不到入参 


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

public String getBody() {
return body;
}
}

3: 在拦截器里面 使用的方式,拦截器中生成request 用下面方法 ,拦截器中用到request的地方都用下面方法新生成的request 

                                                  HttpServletRequest request= new MultiReadHttpServletRequest(httpReq);   

                                                   String body = ((MultiReadHttpServletRequest) request).getBody();  

    这样新生成的 request 流中有数据 ,变量body也有数据 ,  后续拦截器中用到request的地方都用这个新生成的

 

posted @ 2021-10-12 11:23  雪儿蛇王  阅读(645)  评论(0编辑  收藏  举报