Requête HTTP renvoie 200 OK mais pas de contenu en réponse

Dans le développement d'un site web particulier, j'ai un problème intermittent lors du chargement du site dans Firefox (n'ont pas été en mesure de comparer dans IE ou Chrome). Le site se charge de plusieurs fichiers javascript, feuilles de style css, images, etc. Parfois, l'un ou plusieurs des fichiers de ne pas se charger correctement. La réponse indique un état de 200 OK, mais la longueur du contenu indique 0. Ce qui se passe sur des fichiers différents à des moments différents. Quand c'est un fichier javascript qui ne parvient pas à charger, le site ne fonctionne pas correctement, mais peut toujours afficher le contenu. Quand il arrive à être le index.html fichier qui ne parvient pas à charger, Firefox affiche une page vide avec le code html suivant:

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

(Je crois que cela vient de Firefox par défaut "vide" de la page vue)

Il apparaît que les précédents succès de charges peuvent être récupérées correctement à partir de la mémoire cache du navigateur, et l'état de la réponse est "304 not Modified". Après un échec, la prochaine fois que la ressource est demandée, nous voyons un statut de réponse 200 OK, avec les requêtes suivantes à nouveau de répondre à 304.

Ici sont des exemples de la demande/en-têtes de réponse tel que rapporté par Firebug:


Général en Cas de Réussite: (Statut de la Réponse: "304 not Modified", Content-length: 288)

En-Têtes De Requête:

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 

En-Têtes De Réponse:

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 

En-Têtes De Réponse À Partir Du Cache:

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 

L'onglet Cache dans Firebug indique les informations suivantes:

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) 

Échoué Cas: (Statut de la Réponse: 200 OK Content-length: 0)

En-Têtes De Requête:

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 

En-Têtes De Réponse:

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

L'onglet Cache dans Firebug indique les informations suivantes:

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) 

Succès suivant les Cas: (Statut de la Réponse: 200 OK Content-length: 288)

En-Têtes De Requête:

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 

En-Têtes De Réponse:

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 

L'onglet Cache dans Firebug indique les informations suivantes:

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) 

Nous sommes à l'hébergeur du site dans JBoss-EAP v6.1, et j'ai essayé sous Firefox 10, 17 et 24 avec les mêmes résultats. Je sais qu'il existe des versions plus récentes disponibles (pour ne pas mentionner les différents navigateurs), mais ils ne sont pas nécessairement une option pour nous. J'espère que la solution est un simple changement de configuration, mais dans mes tentatives de recherche pour cette question je n'ai pas vu quelqu'un ayant le même problème, donc il peut ne pas être aussi simple. J'apprécie toutes les suggestions. Aussi, s'il vous plaît laissez-moi savoir si j'ai besoin de fournir plus de renseignements (p. ex., web.xml jboss.conf, etc)

D'autres produits dans le mélange:

  • Require.js v2.1.2
  • Java 1.6
  • CAS 3.2.1
  • Atmosphère 2.1.3

Mise à jour: j'ai essentiellement exclu la possibilité d'un problème de cache. J'ai mis en place un contournement du cache du module processus de chargement, comme le suggère le RequireJS API page, et je vois encore le problème. Cette fois, cependant, au lieu de tous les 304 codes d'état, ils sont tous 200.


Mise à jour 2: j'ai téléchargé la source pour JBossWeb 7.2.0.Final et a travaillé à travers le débogage de ce problème. Apparemment, il y a une classe appelée org.apache.coyote.http11.Http11ConnectionHandler qui maintient un pool de Http11Processor, chacune avec ses propres objets Request et Response. Lorsqu'une requête est terminée, le Http11Processor est "recyclé" et les remettre dans la piscine.

Il semble qu'il y a peut être un problème thread dans la logique de recyclage à cause de la Réponse.recycler est censé définir le "commis" pour de faux, mais mon (conditionnel) point d'arrêt immédiatement après l'appel à la réaction.recycler() s'arrête à la réponse.commis == true. C'est quelles sont les causes de l'échec des réponses plus tard. Lorsqu'un Http11Processor qui contient déjà commis objet de Réponse, la Réponse ne peut pas être utilisée pour renvoyer des informations. Il a tout simplement répondu avec un Statut: 200, Content-Length: 0.

Cela semble être le cas lorsque je ferme un site web qui a une Atmosphère de connexion qui utilise le Serveur à des Événements indésirables. Suis-je à l'aide de l'Atmosphère de connexion de mal? Est-il spécial de nettoyage de la logique, je devrais être mise en œuvre?

OriginalL'auteur pacifier21 | 2014-04-29