我正在使用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中完美运行。
答案 0 :(得分:7)
在过去的几个月里,我对此进行了大量的研究 - 在我进入细节之前,我的Web应用程序正在使用在Tomcat 7上运行的GWT 2.x,以及Apache httpd 2.2.x和mod_jk 1.2.x设置在前面。
使用mod_jk版本1.2.26,我偶尔会在日志中看到'encodedRequest不能为空'错误。就像问题所说,这只会发生在IE中,对我来说只有IE8 / 9。问题是我的服务器操作系统是Linux,因此NTLM身份验证无法成为问题。在较新版本的mod_jk(本文中为1.2.37)中,我会在Tomcat日志中获得套接字超时和读取错误。
在每隔几秒钟将我的Web应用程序轮询到服务器期间会记录此错误,以便获取已在单独线程中启动的长时间运行操作的状态。轮询将每五秒钟发生一次,但偶尔会在执行此状态请求时挂起。
经过大量的tcpdump命令后,我发现挂起的请求会出现在Apache重置的TCP连接上;正在向浏览器发送FIN / ACK,服务器将接收POST请求标头和正文,服务器将继续重置连接。然后,奇怪的是,只有标题会从浏览器返回到服务器。经过一番研究,我发现了这个:
Why does Internet Explorer not send HTTP post body on Ajax call after failure?
显然,IE只会在重新发送POST请求期间发送标头。以真正的Microsoft方式,这个问题实际上已经知道了一段时间,发布并安装了一个修补程序,但在客户端计算机上没有启用。如果您不想强制所有用户编辑其注册表,则需要在服务器上禁用HTTP Keep-Alive或将Keep-Alive超时增加到> 60秒对于我的apache httpd服务器,我将KeepAliveTimeout设置为65,将MaxKeepAliveRequests设置为0,以便服务器不会启动连接重置到浏览器。
答案 1 :(得分:3)
这似乎是代理服务器正在剥离请求正文的代理问题,请参阅here。
此外,根据我的经验,这个问题似乎只在使用IE7.0而不是IE6.0时出现
答案 2 :(得分:2)
我有同样的错误。它是由POST请求引起的,当使用NTLM身份验证时没有来自Internet Explorer的数据。
解释如下:
解决方案是:
在MS Windows上的Tomcat上使用WAFFLE 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