GWT IllegalArgumentException: encodedRequest не может быть пустым - PullRequest
7 голосов
/ 31 июля 2009

Я использую 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 ]

7 голосов
/ 12 августа 2013

За последние пару месяцев я провел много исследований в этой области - прежде чем углубляться в детали, мое веб-приложение использует 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 не возникает. В более новых версиях mod_jk (1.2.37 на момент написания этой статьи) вместо этого я получал бы таймаут сокета и ошибку чтения в журналах Tomcat.

Эта ошибка будет регистрироваться во время опроса моего веб-приложения на сервере каждые несколько секунд, чтобы получить статус длительной операции, которая была запущена в отдельном потоке. Опрос происходил бы каждые пять секунд, но иногда он зависал при выполнении этого запроса состояния.

После многих команд tcpdump я обнаружил, что зависший запрос приходит по TCP-соединению, которое сбрасывается Apache; FIN / ACK отправляется в браузер, заголовок и тело запроса POST будут получены сервером, и сервер продолжит сброс соединения. Тогда, как ни странно, только заголовок вернется на сервер из браузера. После небольшого исследования я нашел это:

Почему Internet Explorer не отправляет тело сообщения HTTP при вызове Ajax после сбоя?

По-видимому, IE будет отправлять заголовки только во время повторной отправки запроса POST. По истинной моде Microsoft эта проблема уже давно известна, было выпущено и установлено исправление, но НЕ ВКЛЮЧЕНО на клиентском компьютере. Если вы не хотите заставлять всех своих пользователей редактировать свой реестр, вам нужно либо отключить HTTP Keep-Alive на своем сервере, либо увеличить время ожидания Keep-Alive до> 60 секунд. Для моего сервера Apache httpd я установил для KeepAliveTimeout значение 65, а для MaxKeepAliveRequests - значение 0, чтобы сервер не инициировал сброс подключения к браузеру.

3 голосов
/ 20 августа 2009

Это похоже на проблему с прокси, когда прокси-сервер удаляет тело запроса, см. здесь .

Кроме того, из того, что я испытал, эта проблема возникает только при использовании IE7.0, а не IE6.0

2 голосов
/ 28 января 2013

У меня та же ошибка. Это было вызвано запросом POST без данных из Internet Explorer при использовании проверки подлинности NTLM.

Объяснение здесь:

Решение было:

  • для использования WAFFLE SecurityFilter на Tomcat в MS Windows

    <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
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...