GWT IllegalArgumentException:encodedRequest不能为空

时间:2009-07-31 06:18:57

标签: gwt encoding

我正在使用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中完美运行。

3 个答案:

答案 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