Java Tomcat筛选器生成重复的localhost.log行
这段代码(我继承的大部分代码)运行良好,除了System.out.println(“Success”)在localhost.log中生成大量(7-37,随机)相同的行,而不是在运行时仅生成一行: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
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语句完全无关。