commit
31b67516ee
@ -0,0 +1,53 @@ |
|||||||
|
package com.gitee.sop.servercommon.param; |
||||||
|
|
||||||
|
import javax.servlet.ReadListener; |
||||||
|
import javax.servlet.ServletInputStream; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* byte数组流包装 |
||||||
|
* |
||||||
|
* @author tanghc |
||||||
|
*/ |
||||||
|
public class ByteArrayStreamWrapper extends ServletInputStream { |
||||||
|
|
||||||
|
private byte[] data; |
||||||
|
private int idx = 0; |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a new <code>ByteArrayStreamWrapper</code> instance. |
||||||
|
* |
||||||
|
* @param data a <code>byte[]</code> value |
||||||
|
*/ |
||||||
|
public ByteArrayStreamWrapper(byte[] data) { |
||||||
|
if (data == null) { |
||||||
|
data = new byte[0]; |
||||||
|
} |
||||||
|
this.data = data; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int read() throws IOException { |
||||||
|
if (idx == data.length) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
// I have to AND the byte with 0xff in order to ensure that it is returned as an unsigned integer
|
||||||
|
// the lack of this was causing a weird bug when manually unzipping gzipped request bodies
|
||||||
|
return data[idx++] & 0xff; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isFinished() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isReady() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setReadListener(ReadListener readListener) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,106 @@ |
|||||||
|
package com.gitee.sop.servercommon.param; |
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.apache.commons.io.IOUtils; |
||||||
|
|
||||||
|
import javax.servlet.ReadListener; |
||||||
|
import javax.servlet.ServletInputStream; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletRequestWrapper; |
||||||
|
import java.io.BufferedReader; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStreamReader; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* 包装HttpServletRequest |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
public class MyServletRequestWrapper extends HttpServletRequestWrapper { |
||||||
|
|
||||||
|
private final byte[] body; |
||||||
|
private final Map<String, String[]> parameterMap; |
||||||
|
|
||||||
|
public MyServletRequestWrapper(HttpServletRequest request) { |
||||||
|
super(request); |
||||||
|
// 先缓存请求参数,不然获取不到,原因:
|
||||||
|
// 调用getInputStream方法时,usingInputStream会变成true
|
||||||
|
// 之后再调用request.getParameterMap(),就一直返回空map
|
||||||
|
// 因此要先调用request.getParameterMap()缓存起来
|
||||||
|
// 详见org.apache.catalina.connector.Request.parseParameters()中
|
||||||
|
// if (usingInputStream || usingReader) {
|
||||||
|
// success = true;
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
parameterMap = request.getParameterMap(); |
||||||
|
try { |
||||||
|
body = IOUtils.toByteArray(super.getInputStream()); |
||||||
|
} catch (IOException e) { |
||||||
|
log.error("cache body error, url:{}",request.getRequestURI(), e); |
||||||
|
throw new RuntimeException("cache body error", e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<String, String[]> getParameterMap() { |
||||||
|
return parameterMap; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public BufferedReader getReader() throws IOException { |
||||||
|
return new BufferedReader(new InputStreamReader(getInputStream())); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ServletInputStream getInputStream() throws IOException { |
||||||
|
return new ByteArrayStreamWrapper(body); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* byte数组流包装 |
||||||
|
* |
||||||
|
* @author tanghc |
||||||
|
*/ |
||||||
|
public static class ByteArrayStreamWrapper extends ServletInputStream { |
||||||
|
|
||||||
|
private byte[] data; |
||||||
|
private int idx = 0; |
||||||
|
|
||||||
|
/** |
||||||
|
* Creates a new <code>ByteArrayStreamWrapper</code> instance. |
||||||
|
* |
||||||
|
* @param data a <code>byte[]</code> value |
||||||
|
*/ |
||||||
|
public ByteArrayStreamWrapper(byte[] data) { |
||||||
|
if (data == null) { |
||||||
|
data = new byte[0]; |
||||||
|
} |
||||||
|
this.data = data; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int read() throws IOException { |
||||||
|
if (idx == data.length) { |
||||||
|
return -1; |
||||||
|
} |
||||||
|
// I have to AND the byte with 0xff in order to ensure that it is returned as an unsigned integer
|
||||||
|
// the lack of this was causing a weird bug when manually unzipping gzipped request bodies
|
||||||
|
return data[idx++] & 0xff; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isFinished() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isReady() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setReadListener(ReadListener readListener) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue