springboot 扩展HttpServletRequestWrapper拦截请求修改参数
springboot 扩展HttpServletRequestWrapper拦截请求修改参数
·
- 继承HttpServletRequestWrapper,获取请求参数
public class RequestWrapper extends HttpServletRequestWrapper {
private String body;
public RequestWrapper(HttpServletRequest request) throws IOException {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
ServletInputStream servletInputStream = new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {}
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
};
return servletInputStream;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
public String getBody() {
return this.body;
}
public void setBody(String body) {
this.body = body;
}
}
- 使用filter 配合RequestWrapper ,实现参数变形
@Slf4j
@Component
public class ParameterFilter extends OncePerRequestFilter {
@Autowired
private MultipartResolver multipartResolver;
@Autowired
private JsonUtil jsonUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
boolean multipartParsed = false;
HttpServletRequest req = request;
if (multipartResolver.isMultipart(req)) {
req = multipartResolver.resolveMultipart(req);
multipartParsed = true;
}
ServletRequest requestWrapper = null;
if(req instanceof HttpServletRequest) {
requestWrapper = new RequestWrapper(req);
}
try {
if(requestWrapper == null) {
chain.doFilter(req, response);
} else {
handleSystemParams((RequestWrapper) requestWrapper);
handleBizParams((RequestWrapper) requestWrapper);
chain.doFilter(requestWrapper, response);
}
} catch (Throwable e) {
log.error("parameter Filter exception:{}",e);
} finally {
if (multipartParsed) {
cleanupMultipart(req);
}else {
cleanupSystemParams();
}
}
}
/**
* 处理业务参数
*/
private void handleBizParams(RequestWrapper wrapper) {
String bodyStr = wrapper.getBody();
log.info("url:{},body:{}", wrapper.getRequestURI(), bodyStr);
if (StringUtils.isBlank(bodyStr)){
return;
}
JSONObject bodyJsonObject = new JSONObject(bodyStr);
String dataStr = bodyJsonObject.getStr("data");
JSONObject dataJsonObject = new JSONObject(dataStr);
bodyJsonObject.putAll(dataJsonObject);
wrapper.setBody(bodyJsonObject.toString());
}
/**
* 处理系统参数
*/
private void handleSystemParams(RequestWrapper wrapper) {
String bodyStr = wrapper.getBody();
if (StringUtils.isBlank(bodyStr)){
return;
}
SystemParams systemParams = jsonUtil.toObj(bodyStr,SystemParams.class);
ThreadLocalContext.systemParamsThreadLocal.set(systemParams);
}
/**
* 清除systemParamsThreadLocal
*/
private void cleanupSystemParams() {
ThreadLocalContext.systemParamsThreadLocal.remove();
}
/**
* 清除cleanupMultipart
*/
protected void cleanupMultipart(HttpServletRequest request) {
MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
if (multipartRequest != null) {
this.multipartResolver.cleanupMultipart(multipartRequest);
}
}
@Override
public void destroy() {
}
更多推荐
所有评论(0)