我使用gwt1.5,Struts2的,Spring和Hibernate。 我收到以下错误:
ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/project name] - Exception while dispatching incoming RPC call java.lang.IllegalArgumentException: encodedRequest cannot be empty
此错误只发生在IE浏览器,但它在Firefox正常使用。
我已经做了很多的研究,这在过去的几个月中 - 之前,我进入细节,我的web应用程序使用GWT 2.X在Tomcat 7上运行,与Apache httpd的2.2.x的和mod_jk的1.2.x版本设置在前面。
随着mod_jk的版本1.2.26,我偶尔看到“encodedRequest不能为空”错误日志。 类似的问题说,这只会发生在IE中,我只IE8 / 9。 问题是,我的服务器操作系统是Linux,所以没有办法,NTLM身份验证可能是问题。 在(在写这篇文章1.2.37)的mod_jk的新版本,我反而会得到一个套接字超时,并在Tomcat的日志读取错误。
将我的Web应用程序服务器的轮询期间为了得到那个曾在一个单独的线程已经展开了长时间运行的操作的状态,每隔几秒钟记录此错误。 轮询会发生每五秒钟,但偶尔,而这样做的地位要求它会挂起。
很多tcpdump的命令后,我发现,挂请求会来这是一个由Apache的重置TCP连接; 一个FIN / ACK正在发送到浏览器,POST请求标题和正文将由服务器接收,并且服务器将继续重置连接。 于是,奇怪的是,只有头会回来从浏览器服务器。 研究过了一会儿,我发现这一点:
为什么Internet Explorer中没有Ajax调用发送HTTP POST正文失败后?
显然,IE只会POST请求的重新发送期间发送的报头。 在真正的微软风格,这个问题实际上已经知道了一段时间,修复程序被发布和安装,但尚未启用的客户机上。 如果你不希望强制所有用户编辑他们的注册表,你需要或者禁用HTTP保持活动的服务器或增加保持活动超时到> 60秒。 对于我的Apache httpd的服务器,我设置的KeepAliveTimeout 65和MaxKeepAliveRequests为0,从而使服务器无法启动连接重置浏览器。
这似乎是在代理服务器剥出请求主体的代理问题,请参见这里 。
此外,从我经历过这个问题似乎只使用IE7.0和IE6.0没有时发生
我已经得到了同样的错误。 它是由来自Internet Explorer中没有数据POST请求使用NTLM身份验证时引起的。
说明是在这里:
- http://lists.samba.org/archive/jcifs/2006-September/006554.html
- 为什么“内容长度:0”在POST请求?
解决办法是:
使用WAFFLE在MS Windows上的Tomcat SecurityFilter类
<filter> <filter-name>MySecurityFilter</filter-name> <filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class> <init-param> <param-name>waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name> <param-value> NTLM </param-value> </init-param> </filter> <filter-mapping> <filter-name>MySecurityFilter</filter-name> <url-pattern>/appA/*</url-pattern> <url-pattern>/appB/*</url-pattern> </filter-mapping>`
或者,设置注册表键DisableNTLMPreAuth
在客户端上。
registry key: HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/ Value Name: DisableNTLMPreAuth Data Type: REG_DWORD Value: 1