Java Tomcat筛选器生成重复的localhost.log行

Java Tomcat筛选器生成重复的localhost.log行,java,tomcat,servlet-filters,Java,Tomcat,Servlet Filters,这段代码(我继承的大部分代码)运行良好,除了System.out.println(“Success”)在localhost.log中生成大量(7-37,随机)相同的行,而不是在运行时仅生成一行: Mar 1, 2011 8:49:47 AM org.apache.catalina.core.StandardWrapperValve invoke Success Mar 1, 2011 8:49:47 AM org.apache.catalina.core.StandardWrapperValve

这段代码(我继承的大部分代码)运行良好,除了System.out.println(“Success”)在localhost.log中生成大量(7-37,随机)相同的行,而不是在运行时仅生成一行:

Mar 1, 2011 8:49:47 AM org.apache.catalina.core.StandardWrapperValve invoke
Success
Mar 1, 2011 8:49:47 AM org.apache.catalina.core.StandardWrapperValve invoke
Success
Mar 1, 2011 8:49:47 AM org.apache.catalina.core.StandardWrapperValve invoke
Success
发生什么事了

public class SpecialFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc)
        throws IOException, ServletException {
    if (request instanceof HttpServletRequest) {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String mainID = httpRequest.getRemoteUser();
        String username = "";
        try {
            Cookie c[] = httpRequest.getCookies();
            if (c == null) {
                username = getID(mainID);  // method omitted, just executes a SQL query
            } else {
                boolean cookieFound = false;
                for (int i = 0; i < c.length; i++) {
                    if (c[i].getName().equals("mainCookie")) {
                        username = c[i].getValue();
                        cookieFound = true;
                        break;
                    }
                }
                if (cookieFound) {
                    System.out.println("Success");
                } else {
                    username = getID(mainID);
                }
            }
        } catch (SQLException e) {
            System.out.println("Error 1 " + e);
            throw new ServletException(error, e);
        }
        AuthRequestWrapper wrapper = new AuthRequestWrapper(httpRequest, username);
        fc.doFilter(wrapper, response);
    }
    else {
        throw new RuntimeException("request is not a valid httpRequest object.");
    }
}
公共类SpecialFilter实现过滤器{
公共无效doFilter(ServletRequest请求、ServletResponse响应、FilterChain fc)
抛出IOException、ServletException{
if(HttpServletRequest的请求实例){
HttpServletRequest httpRequest=(HttpServletRequest)请求;
字符串mainID=httpRequest.getRemoteUser();
字符串username=“”;
试一试{
Cookie c[]=httpRequest.getCookies();
如果(c==null){
username=getID(mainID);//方法省略,只执行SQL查询
}否则{
布尔cookieFound=false;
for(int i=0;i

}

对于log4j,我在为追加器分配重叠路径时遇到了重复的日志消息。比如说

com.blah.blam=appendThis

com.blah=appendThis

您没有为此筛选器提供URL映射,但我怀疑它已映射到生成的HTML中的其他元素

例如,如果一个页面包含5个图像和2个CSS文件,那么客户机将在解析生成的HTML后为单个页面请求发出7个额外的HTTP请求。在这种情况下,我希望看到打印出8行
SUCCESS


通过打印
httpRequest.getRequestURL()

您可以始终看到每个请求的路径。您有多个记录器连接到同一个类。只需禁用根记录器。这就是大多数情况下重复日志语句的问题。
干杯

我要做的第一件事就是附加一个调试器,并在System.out.println语句中设置一个断点。完成此操作后,您应该能够查看堆栈,并找出是否/为什么会重复调用它。能否提供web.xml中将此筛选器附加到筛选器队列的部分?代码只是执行System.out.println,所以我怀疑log4j是否是问题的原因。输出与System.out调用不匹配。我假设还有一些没有提到的日志记录。除非tomcat将“invoke”添加到System.out调用中。我假设以“invoke”结尾的行实际上是另一行,并且与显示的System.out.println语句完全无关。