Que signifie exactement “Réponse déjà engagé”? Comment gérer les exceptions?
Je sais que l'écriture de la logique dans les getters et les setters est une très mauvaise programmation de la pratique, mais est-il possible de gérer des exceptions si la réponse est déjà engagé?
Quel est exactement le sens de "Réponse déjà commis" et "en-Têtes sont déjà envoyée au client"?
OriginalL'auteur ylnsagar | 2013-01-18
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de bonne façon de gérer les exceptions si la réponse est déjà engagé. La réponse HTTP existent essentiellement d'un en-tête et un corps. Les en-têtes de coeur de demander au client (le navigateur internet) exactement comment il doit traiter avec la réponse, par exemple, le type de contenu, la longueur du contenu, de l'encodage des caractères, le corps de l'encodage, le cache d'instructions, et cætera.
Vous pouvez voir les en-têtes HTTP moniteur de trafic de la webbrowser du développeur d'outils. Appuyez sur la touche F12 dans Chrome/IE9+/Firefox23+ et vérifier l'onglet "Réseau". Ci-dessous screenshow est ce que mon Chrome montre sur votre question:
(note: la "Réponse" de l'onglet montre le corps de la réponse)
Le corps de la réponse est le contenu réel, généralement dans la saveur d'un tas de code HTML. Le serveur a généralement une taille fixe de la mémoire tampon d'écrire la réponse. La taille de la mémoire tampon dépend du serveur/de version et de configuration et est généralement de 2 KO~10KB. Si cette dépassements de la mémoire tampon, puis il sera affichée à l'autre extrémité de la connexion, le client. C'est la validation d'une réponse. Le client a déjà obtenu la première partie de la réponse, le plus souvent déjà de représenter l'ensemble des tas de têtes et peut-être une partie du corps.
De la validation d'une réponse est un point de non-retour. Le serveur ne peut pas prendre le déjà octets envoyés en arrière. Il est trop tard pour modifier les en-têtes de réponse (par exemple, une redirection est essentiellement chargé par un
Location
- tête avec y la nouvelle URL) et, a fortiori, le corps de la réponse. Le mieux ce que vous pouvez faire est d'ajouter les informations d'erreur dans le déjà écrit le corps de la réponse. Mais cela peut retrouver dans certains bizarre regardant HTML comme on ne sait pas qui les balises HTML doit être fermé. Le navigateur peut ne pas présenter d'une manière appropriée.À part éviter de logique métier dans les méthodes de lecture, de sorte que les exceptions ne sont pas jetés pendant le rendu de la réponse, une autre façon d'éviter un déjà commis réponse est de configurer la réponse de la taille de la mémoire tampon pour être la plus grande page de votre webapp peut servir. La façon de le faire dépend du serveur/version. Dans Tomcat par exemple, vous pouvez le configurer comme
bufferSize
de l'attribut<Connecteur>
de l'élément. Notez que cela n'empêche pas de rinçage si votre code est (implicitement) l'appel deflush()
sur la réponse au flux de sortie.Vous êtes les bienvenus.
OriginalL'auteur BalusC
Bonne exlanation BalusC et je voudrais ajouter que primefaces a un problème dans leur gestionnaire d'exception. Ils tentent de rediriger vers une page d'erreur après la demande a déjà été commis. Et comme vous l'avez dit, la seule solution que j'ai trouvé est d'ajouter du contenu supplémentaire pour le corps de la réponse. Je owerride le gestionnaire et ajoutez ce code
writer.endElement( "body" );
aprèswriter.endElement( "script" );
.OriginalL'auteur Rustam