java - Spring boot http请求记录器中断控制器
问题描述
我正在使用自定义记录器来记录所有进入服务器的 http 请求,直到现在它工作正常,但是当我收到“multipart/form-data”请求时,它失败并且根本不执行控制器中的函数。
当我从程序中删除记录器类时,它可以工作,所以我确信记录器类中缺少请求处理。
LoggableDispatcherServlet.class
public class LoggableDispatcherServlet extends DispatcherServlet {
private final Log logger = LogFactory.getLog(getClass());
@Override
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (!(request instanceof ContentCachingRequestWrapper)) {
request = new ContentCachingRequestWrapper(request);
}
if (!(response instanceof ContentCachingResponseWrapper)) {
response = new ContentCachingResponseWrapper(response);
}
HandlerExecutionChain handler = getHandler(request);
try {
super.doDispatch(request, response);
} finally {
log(request, response, handler);
updateResponse(response);
}
}
private void log(HttpServletRequest requestToCache, HttpServletResponse responseToCache, HandlerExecutionChain handler) {
LogMessage log = new LogMessage();
log.setHttpStatus(responseToCache.getStatus());
log.setHttpMethod(requestToCache.getMethod());
log.setUrl(requestToCache.getRequestURI());
log.setClientIp(requestToCache.getRemoteAddr());
log.setJavaMethod(handler.toString());
log.setResponse(getResponsePayload(responseToCache));
logger.info(log);
}
private String getResponsePayload(HttpServletResponse response) {
ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class);
if (wrapper != null) {
byte[] buf = wrapper.getContentAsByteArray();
if (buf.length > 0) {
int length = Math.min(buf.length, 5120);
try {
return new String(buf, 0, length, wrapper.getCharacterEncoding());
}
catch (UnsupportedEncodingException e) {
logger.error(e.getMessage(), e);
}
}
}
return "[unknown]";
}
private void updateResponse(HttpServletResponse response) throws IOException {
ContentCachingResponseWrapper responseWrapper =
WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class);
responseWrapper.copyBodyToResponse();
}
}
我可以看到失败是我打电话的时候
super.doDispatch(request, response);
我相信它只能处理简单的请求,如应用程序/json 内容,但我猜当请求不同时,它无法处理。
我试图实现这里的答案中提到的一些事情-resolving-multipart-form-data-request-in-spring-filter-但我无法使其工作。
解决方案
推荐阅读
- google-data-studio - google-data-studio 将大多数维度值分组到其他类别中
- python - 当控制台显示“在 http://127.0.0.1:5000/ 上运行”时,浏览器上出现错误 404
- mysql - MySQL查询给出错误你不能指定目标表
- jquery - 从 WooCommerce 可变产品的变体中自动选择第一个可用选项
- ios - SwiftUI 文本字段文本颜色问题
- javascript - javascript 上的二进制搜索
- c - 发送日期和时间作为 TCP 服务器欢迎消息
- javascript - 对现有请求提出请求
- javascript - 在对象数组中创建具有相同键平均值的新数组
- sql - 在 Oracle PL SQL 中的 CONNECT_BY_ROOT 之后显示直接父级