2014-04-29 18 views
9

Podczas tworzenia strony internetowej mam sporadyczny problem podczas ładowania strony w przeglądarce Firefox (nie mogłem porównać w IE lub Chrome). Witryna ładuje kilka plików javascript, arkusze stylów CSS, obrazy itp. Czasami jeden lub więcej plików nie ładuje się poprawnie. Odpowiedź wskazuje status 200 OK, ale długość zawartości wskazuje 0. Dzieje się to w różnych plikach o różnych porach. Gdy jest to plik javascript, który nie może się załadować, witryna nie działa poprawnie, ale nadal może wyświetlać treść. Kiedy zdarza się plik index.html, że nie można załadować, Firefox wyświetla pustą stronę z następującym HTML:Żądanie HTTP zwraca 200 OK, ale brak treści w odpowiedzi

<html> 
<head></head> 
<body><pre></pre></body> 
</html> 

(wierzę, że to pochodzi z Firefoksa jako domyślną „pusty” Odsłona)

Wygląda na to, że poprzednie pomyślne obciążenia mogły zostać poprawnie pobrane z pamięci podręcznej przeglądarki, a stan odpowiedzi to 304 Nie zmodyfikowano. Po niepowodzeniu, przy następnym żądaniu zasobu widzimy status odpowiedzi 200 OK, a kolejne żądania ponownie odpowiadają 304.

Oto przykłady nagłówków żądania/odpowiedzi jak donosi Firebug:


Ogólne Success Case (Stan Response: 304 Not Modified, Content-Length: 288)

Żądanie Nagłówki:

Accept: */* 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en/q=0.5 
Connection: keep-alive 
Cookie: JSESSIONID=<shouldn't matter> 
Host: ???.???.???.???:8442 
If-Modified-Since: Tue, 29 Apr 2014 13:18:26 GMT 
If-None-Match: W/"228-1398777506000" 
Referrer: https://???.???.???.???:8442/mySite/ 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131023 Firefox/17.0 

odpowiedzi Nagłówki:

Cache-Control: no-cache 
Date: Tue, 29 Apr 2014 13:36:35 GMT 
Etag: W/"288-1398777506000" 
Expires: Thu, 01 Jan 1970 00:00:00 GMT-00:00 
Pragma: No-cache 
Server: Apache-Coyote/1.1 

nagłówki odpowiedzi z pamięci podręcznej:

Accept-Ranges: bytes 
Cache-Control: no-cache 
Content-Length: 288 
Content-Type: text/javascript 
Date: Tue, 29 Apr 2014 13:36:35 GMT 
Etag: W/"288-1398777506000" 
Expires: Thu, 01 Jan 1970 00:00:00 GMT-00:00 
Last-Modified: Tue, 29 Apr 2014 13:18:26 GMT 
Pragma: No-cache 
Server: Apache-Coyote/1.1 

Zakładka Cache w Firebug wskazuje następujące:

Data Size: 288 
Device: disk 
Expires: Wed Dec 31 1969 18:00:00 GMT-06:00 (CST) 
Fetch Count: 81 
Last Fetched: Tue Apr 29 2014 08:28:35 GMT-05:00 (CDT) 
Last Modified: Tue Apr 29 2014 08:28:35 GMT-05:00 (CDT) 

Failed koperty: (status odpowiedzi: 200 OK Content-Length: 0)

Żądanie Nagłówki:

Accept: */* 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en/q=0.5 
Connection: keep-alive 
Cookie: JSESSIONID=<same as above> 
Host: ???.???.???.???:8442 
If-Modified-Since: Tue, 29 Apr 2014 13:18:26 GMT 
If-None-Match: W/"228-1398777506000" 
Referrer: https://???.???.???.???:8442/mySite/ 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131023 Firefox/17.0 

Response Nagłówki:

Content-Length: 0 
Date: Tue, 29 Apr 2014 13:36:28 GMT 
Server: Apache-Coyote/1.1 

Zakładka Cache w Firebug oznacza:

Data Size: 
Device: disk 
Expires: Wed Dec 31 1969 18:00:00 GMT-06:00 (CST) 
Fetch Count: 83 
Last Fetched: Tue Apr 29 2014 08:28:42 GMT-05:00 (CDT) 
Last Modified: Tue Apr 29 2014 08:28:42 GMT-05:00 (CDT) 

kolejny sukces przypadków: (status odpowiedzi: 200 OK Content-Length: 288)

Żądanie Nagłówki:

Accept: */* 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en/q=0.5 
Connection: keep-alive 
Cookie: JSESSIONID=<same as above> 
Host: ???.???.???.???:8442 
Referrer: https://???.???.???.???:8442/mySite/ 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131023 Firefox/17.0 

Response Nagłówki:

Accept-Ranges: bytes 
Cache-Control: no-cache 
Content-Length: 288 
Content-Type: text/javascript 
Date: Tue, 29 Apr 2014 13:37:03 GMT 
Etag: W/"288-1398777506000" 
Expires: Thu, 01 Jan 1970 00:00:00 GMT-00:00 
Last-Modified: Tue, 29 Apr 2014 13:18:26 GMT 
Pragma: No-cache 
Server: Apache-Coyote/1.1 

Zakładka Cache w Firebug wskazuje następujące:

Data Size: 288 
Device: disk 
Expires: Wed Dec 31 1969 18:00:00 GMT-06:00 (CST) 
Fetch Count: 85 
Last Fetched: Tue Apr 29 2014 08:28:54 GMT-05:00 (CDT) 
Last Modified: Tue Apr 29 2014 08:28:53 GMT-05:00 (CDT) 

Jesteśmy gospodarzem stronę w JBoss EAP-v6.1, a ja próbowałem to w Firefoksie 10, 17 i 24 z tych samych wyników. Rozumiem, że dostępne są nowsze wersje (nie wspominając o różnych przeglądarkach), ale niekoniecznie są one dla nas opcją. Mam nadzieję, że rozwiązanie to prosta zmiana konfiguracji, ale w moich próbach poszukiwania tego problemu nie widziałem nikogo, kto miałby ten sam problem, więc może nie być tak proste. Doceniam wszelkie sugestie. Ponadto daj mi znać, jeśli chcę podać więcej informacji (np. Web.xml, jboss.conf, etc)

Inne produkty z tej mieszanki:

  • Require.js v2.1.2
  • Java 1.6
  • CAS 3.2.1
  • Atmosfera 2.1.3

Aktualizacja: W zasadzie wykluczyłem możliwość wystąpienia problemu z pamięcią podręczną. Zaimplementowałem proces ładowania modułu pomijania pamięci podręcznej zgodnie z sugestią na stronie RequireJS API i nadal widzę problem. Tym razem jednak zamiast wszystkich 304 kodów stanu, wszystkie mają wartość 200.


Aktualizacja 2: Pobrałem źródła JBossWeb 7.2.0.Final i pracował przez debugowanie ten problem. Najwyraźniej istnieje klasa o nazwie org.apache.coyote.http11.Http11ConnectionHandler, która utrzymuje pulę instancji Http11Processor, z których każdy ma własne obiekty żądania i odpowiedzi. Po zakończeniu żądania procesor Http11Processor jest "poddawany recyklingowi" i ponownie wprowadzany do puli.

Wygląda na to, że w logice recyklingu może występować problem z gwintowaniem, ponieważ Response.recycle ma ustawić "commit" na false, ale mój (warunkowy) punkt przerwania natychmiast po wywołaniu response.recycle() zatrzymuje się z response.citted == true. To właśnie powoduje późniejsze nieudane odpowiedzi. Gdy procesor Http11, który zawiera już zatwierdzony obiekt odpowiedzi, odpowiedzi nie można użyć do zwrócenia jakichkolwiek informacji. Po prostu odpowiada Stan: 200, Długość treści: 0.

Wydaje się, że dzieje się tak, gdy zamykam stronę internetową, która ma połączenie Atmosphere, które wykorzystuje zdarzenia Side Side. Czy nieprawidłowo używam połączenia Atmosfera? Czy powinienem wprowadzić specjalną logikę oczyszczania?

Odpowiedz

5

Po wielu badaniach i debugowaniu dowiedziałem się, że biblioteka Atmosfera mogła manipulować obiektem Response, który został poddany recyklingowi i przyzwyczaił się do późniejszego żądania. Odpowiedzią, której dotyczy problem, nadano status 200, długość treści wynosząca 0, i została ona zatwierdzona w taki sposób, że nie można było wprowadzić żadnych innych modyfikacji. Pechowy wątek żądania, który ma tę "uszkodzoną" instancję odpowiedzi, nie może być użyty do dostarczenia rzeczywistej treści.

Aby zapobiec tej zmiany nie mają wpływu na serwer JBoss, dodałem następujące do pliku jboss.properties:

org.apache.catalina.connector.RECYCLE_FACADES=true 

Inną opcją jest użycie Security Manager. (Patrz sekcji Zabezpieczenia this strony i porady oferowane w ostatnich kilku akapitach this stronie)

Ten pozornie uniemożliwia recykling żądań i odpowiedzi, więc zawsze świeże instancji reagowania na każde żądanie.

+0

cześć, używam jboss eap 6.4, primefaces 5.3 i atmosphere 2.4.8. Mam dokładnie taki sam problem, jak ty, ale po dodaniu właściwości org.apache.catalina.connector.RECYCLE_FACADES do standalone.xml, napotkałem wyjątek (Interceptor Atmosphere LifeCycle uległo awarii.Proces przetwarzania będzie kontynuowany z innym przechwytywaczem: java.lang .IllegalStateException: JBWEB000057: Obiekt żądania został poddany recyklingowi i nie jest już powiązany z tą fasadą). czy napotkałeś podobny problem? – bluebloodedboy

+0

Widziałem ten wyjątek. Wykonałem wiele innych prac związanych z Atmosphere, które czyści instancje AtmosphereResource, głównie z tego powodu, że używam BlockingIOCometSupport (tylko z powodu braku wsparcia AsyncIO). W naszej aplikacji jest wystarczająco dużo jazdy rowerem przez AtmosphereResources, że ten wyjątek nie spowodował żadnych drastycznych problemów (które zauważyliśmy). – pacifier21

0

Prawdopodobnie masz próbny blok catch, który połknie błąd i nie wygeneruje żadnego wyjścia. Być może gdzieś rejestruje błąd.

+0

To zdecydowanie rozsądna teoria. Sprawdziłem wszystkie zjedzone wyjątki, ale nie mogłem nic znaleźć.Podczas debugowania (używając Eclipse) dodałem "stop na złapanych/nieprzechwyconych wyjątkach" i nie trafiłem na nic niezwykłego. Na pewno będę o tym pamiętać, ale nie wierzę, że to jest podstawowa przyczyna. Zobacz Aktualizacja 2 w pytaniu. – pacifier21

Powiązane problemy