Springboot 打war包过滤器执行了两次

springboot项目,利用过滤器,输出每次请求的url和参数
日志用的lombok + log4j2
在jar包的情况下输出是正常的
但打成war包就会出现问题
发现过滤器的日志打印了两次,但Controller是正常的只打印了一次,所以Controller应该只跑了一次
log4j2配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO">
    <Properties>
        <property name="LOG_PATTERN" value="%date{yy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
        <property name="FILE_PATH" value="/log/rest-log" />
        <property name="FILE_NAME" value="rest-log" />
    </Properties>

    <appenders>

        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        </console>
        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/log.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log">
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="50MB"/>
            </Policies>
            <DefaultRolloverStrategy max="99"/>
        </RollingFile>
    </appenders>

    <loggers>
        <logger name="org.mybatis" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </logger>
        <Logger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <root level="info">
            <appender-ref ref="Console"/>
            <!--<appender-ref ref="FileLog"/>-->
            <appender-ref ref="RollingFileInfo"/>
        </root>
    </loggers>
</configuration>

过滤器配置

@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);
        log.info("[{}] {}ms, {}{}", request.getMethod(),System.currentTimeMillis() - time, request.getRequestURI(), params.toString());
    }
}

打印出来的时间戳之差还不一样
打印出来的url并不是什么/favicon.ico,就是两个相同的url

阅读 2.6k
1 个回答

楼主问题解决了吗,我这边解决springboot默认支持打jar包打war包的话不能使用@WebFilter需要自己注册个bean代码如下:
@Bean

public FilterRegistrationBean filterRegistrationBean(){
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    HttpRequestFilter filter=new HttpRequestFilter();
    registrationBean.setFilter(filter);
    List<String> urls = new ArrayList<>();
    urls.add("/*");
    registrationBean.setUrlPatterns(urls);
    return registrationBean;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题