我使用SpringBoot2.1.5生成一个Web应用程序,并且使用maven包将战争部署在tomcat9外部。 我创建了一个过滤器来打印请求uri,但是过滤器执行两次。 但是当我使用IDE控制台或jar包时,它只打印一次!?
控制台和日志文件输出两个相同的URL,
不是/favicon.ico
,只需测试网址,
并且两个输出的时间戳不同
filter.java
@Slf4j
@Component
@WebFilter(filterName = "ApiFilter", urlPatterns = "/*")
public class RequestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
long time = System.currentTimeMillis();
HttpServletRequest request = (HttpServletRequest) servletRequest;
filterChain.doFilter(servletRequest, servletResponse);
StringBuilder params = new StringBuilder("?");
Map<String, String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
params.append(entry.getKey()).append("=");
for (String s : entry.getValue()) {
params.append(s).append(",");
}
params.deleteCharAt(params.length() - 1);
params.append("&");
}
params.deleteCharAt(params.length() - 1);
System.out.println("HAHAHAHAHAHAHa");
log.info("[{}] {}ms, {}{}", request.getMethod(),System.currentTimeMillis() - time, request.getRequestURI(), params.toString());
}
}
输出
19-09-11 19:33:39.450 [http-nio-8989-exec-1] INFO com.proj.aftermarket.config.RequestFilter - [POST] 14ms, /Proj/web-control!checkTime.do
19-09-11 19:33:39.451 [http-nio-8989-exec-1] INFO com.proj.aftermarket.config.RequestFilter - [POST] 15ms, /Proj/web-control!checkTime.do
我希望只打印一次,但是打印两次 谢谢。
答案 0 :(得分:0)
使用org.springframework.web.filter.OncePerRequestFilter
代替Filter
。顾名思义,这将确保每个请求仅执行一次过滤器。
由于OncePerRequestFilter
是一个类,因此您需要扩展它而不是实现。
来自Javadoc:
过滤器基类,旨在确保在任何servlet容器上每个请求分派一个执行。它提供了带有
doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
和HttpServletRequest
参数的HttpServletResponse
方法。