mirror of
https://github.com/chillzhuang/blade-tool
synced 2024-09-21 04:04:20 +08:00
120 lines
3.0 KiB
Java
120 lines
3.0 KiB
Java
/**
|
||
* Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
|
||
* <p>
|
||
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
* <p>
|
||
* http://www.gnu.org/licenses/lgpl.html
|
||
* <p>
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
package org.springblade.core.tool.request;
|
||
|
||
import org.springblade.core.tool.utils.WebUtil;
|
||
import org.springframework.http.HttpHeaders;
|
||
import org.springframework.http.MediaType;
|
||
|
||
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.ByteArrayInputStream;
|
||
import java.io.IOException;
|
||
import java.io.InputStreamReader;
|
||
|
||
/**
|
||
* 全局Request包装
|
||
*
|
||
* @author Chill
|
||
*/
|
||
public class BladeHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
||
|
||
/**
|
||
* 没被包装过的HttpServletRequest(特殊场景,需要自己过滤)
|
||
*/
|
||
private final HttpServletRequest orgRequest;
|
||
/**
|
||
* 缓存报文,支持多次读取流
|
||
*/
|
||
private byte[] body;
|
||
|
||
|
||
public BladeHttpServletRequestWrapper(HttpServletRequest request) {
|
||
super(request);
|
||
orgRequest = request;
|
||
}
|
||
|
||
@Override
|
||
public BufferedReader getReader() throws IOException {
|
||
return new BufferedReader(new InputStreamReader(getInputStream()));
|
||
}
|
||
|
||
@Override
|
||
public ServletInputStream getInputStream() throws IOException {
|
||
if (super.getHeader(HttpHeaders.CONTENT_TYPE) == null) {
|
||
return super.getInputStream();
|
||
}
|
||
|
||
if (super.getHeader(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.MULTIPART_FORM_DATA_VALUE)) {
|
||
return super.getInputStream();
|
||
}
|
||
|
||
if (body == null) {
|
||
body = WebUtil.getRequestBody(super.getInputStream()).getBytes();
|
||
}
|
||
|
||
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body);
|
||
|
||
return new ServletInputStream() {
|
||
|
||
@Override
|
||
public int read() {
|
||
return byteArrayInputStream.read();
|
||
}
|
||
|
||
@Override
|
||
public boolean isFinished() {
|
||
return false;
|
||
}
|
||
|
||
@Override
|
||
public boolean isReady() {
|
||
return false;
|
||
}
|
||
|
||
@Override
|
||
public void setReadListener(ReadListener readListener) {
|
||
}
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 获取初始request
|
||
*
|
||
* @return HttpServletRequest
|
||
*/
|
||
public HttpServletRequest getOrgRequest() {
|
||
return orgRequest;
|
||
}
|
||
|
||
/**
|
||
* 获取初始request
|
||
*
|
||
* @param request request
|
||
* @return HttpServletRequest
|
||
*/
|
||
public static HttpServletRequest getOrgRequest(HttpServletRequest request) {
|
||
if (request instanceof BladeHttpServletRequestWrapper) {
|
||
return ((BladeHttpServletRequestWrapper) request).getOrgRequest();
|
||
}
|
||
return request;
|
||
}
|
||
|
||
}
|