tomcat错误诊断

对方服务器发送过来的数据,并未按照预期到达相应的servlet处理,怀疑是HTTP解析时出现问题,但在tomcat的日志中没有发现报错信息。于是开始逐步查找原因:

第一步:打开日志报错功能。在conf目录下的logging.properties文件中增加:

 

org.apache.coyote.level=FINEST
 这个文件是tomcat运行时的日志配置文件,默认情况下隐藏了所有的错误,甚至是运行时报错。

 

 

第二步:重新发送数据,在日志中捕捉到一下错误:

 

org.apache.coyote.http11.AbstractHttp11Processor process
详细: Error preparing request
java.lang.IllegalArgumentException
at org.apache.tomcat.util.http.MimeHeaders.getUniqueValue(MimeHeaders.java:343)
at org.apache.coyote.Request.getContentLengthLong(Request.java:292)
at org.apache.coyote.http11.AbstractHttp11Processor.prepareRequest(AbstractHttp11Processor.java:1275)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:998)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
 第三步:查找具体原因:

 

   /**
     * Finds and returns a unique header field with the given name. If no such
     * field exists, null is returned. If the specified header field is not
     * unique then an {@link IllegalArgumentException} is thrown.
     */
    public MessageBytes getUniqueValue(String name) {
        MessageBytes result = null;
        for (int i = 0; i < count; i++) {
            if (headers[i].getName().equalsIgnoreCase(name)) {
                if (result == null) {
                    result = headers[i].getValue();
                } else {
                    throw new IllegalArgumentException();//这一行
                }
            }
        }
        return result;
    }

 结论是:长度的content-length字段重复。

第四步:确认。向自制的服务器发送消息,确认是重复,而且两个数值还不一样。

 

你可能感兴趣的:(tomcat)