2009-10-28 2 views
8

Je suis dans la situation où j'écris des pages d'erreur personnalisées pour une application Web (principalement pour réduire la divulgation d'informations à partir des pages d'erreur par défaut du conteneur de servlet). Puisque j'ai besoin d'une page d'erreur pour chaque code d'état d'erreur, je vais devoir avoir une réponse sensible pour chaque code. Autant que je sache, ces pages d'erreur ne doivent pas être particulièrement conviviales, mais simplement rediriger tout vers une seule page d'erreur «ça s'est mal passé» va rendre le diagnostic des problèmes très difficile. Je me demande donc s'il existe une bibliothèque Java qui fournit un bon mappage entre les codes d'état HTTP et une brève description compréhensible par l'homme (idéalement un résumé de 2 à 4 mots, à utiliser comme titre de page). , ainsi qu'un message de phrase 1-3 développant sur le résumé). Ensuite, je pourrais simplement l'utiliser dans un JSP pour fournir des commentaires sur la classe de l'erreur. Sinon, je suis sûr que je peux en écrire un moi-même, mais si des roues ont été inventées, je suis heureux de les utiliser.Bibliothèque Java pour mapper le code d'état HTTP à la description?

Répondre

11

Je me demande s'il y a une bibliothèque Java qui fournit une bonne cartographie entre les codes d'état HTTP et une brève la description lisible par l'homme d'entre eux (idéalement un 2-4 mot « résumé », pour utiliser en tant que titre de page, ainsi qu'un message de phrase 1-3 développant le résumé ).

Oui, Apache Commons HttpClient a cette fonctionnalité. La classe HttpStatus a la même liste de constantes int que vous trouverez ailleurs, mais elle a également une méthode static String getStatusText(int) qui renvoie une description lisible par l'homme du code d'état.

Voici la dépendance Maven:

<dependency> 
    <groupId>commons-httpclient</groupId> 
    <artifactId>commons-httpclient</artifactId> 
    <version>3.1</version> 
</dependency> 

Exemple Code:

import org.apache.commons.httpclient.HttpStatus; 

String responseMessage = HttpStatus.getStatusText(HttpStatus.SC_OK); 
System.out.println(responseMessage); 

Prints:

OK 
+0

Quel jar dois-je ajouter au chemin de compilation pour utiliser cette méthode? J'ai ajouté tous et aucun d'eux ne fonctionne. –

+0

Pour la version 4 de ce projet apache: httpComponents, regardez ma réponse ci-dessous – Chaiavi

3

La classe abstraite 'HttpURLConnection' vous fournit des valeurs int constantes pour tous les codes d'état HTTP. Sa documentation a une description verbale courte pour chaque constante. Vous pourriez vous faire une simple énumération avec ces valeurs et ces chaînes, et l'utiliser.

1

Si vous utilisez Jersey (ou l'avez sur votre chemin de classe), l'énumération javax.ws.rs.core.Response.Status inclut des "raisons" lisibles par l'utilisateur à partir de la spécification HTTP, par ex. Response.Status.fromStatusCode(404).toString() donne "Not Found".

+4

Pourquoi 'Response.Status.fromStatusCode (405)' renvoie-il 'null'? – Stefan

+1

@Stefan: Je viens de passer un moment à me cogner la tête contre ça aussi. NOT_ALLOWED n'est simplement pas inclus dans Response.Status enum. Notez qu'il existe en fait une interface http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/Response.StatusType.html qui vous permet de créer vos propres types de statut. Utile, mais seulement si ce que vous utilisez pour accepter une instance StatusType plutôt qu'une instance Status ... – PapaFreud

+0

@Stefan existe dans 'ClientResponse.Status' et dans' Responses.METHOD_NOT_ALLOWED_TYPE'. J'ai fini par créer ma propre liste. – GuiSim

4

Peut-être la solution la plus simple est d'utiliser la fonction suivante:

httpResponse.getStatusLine().getReasonPhrase() 

Il retourne exactement ce qui est nécessaire.

3

derniers composants http apache v4 + (httpCoponents)

aborde les sujets suivants: httpStatus comme ENUM contenant tous les httpStatuses

Pour leur utilisation description: EnglishReasonPhraseCatalog.INSTANCE.getReason (code, Locale. ANGLAIS);

Si votre code d'état == code, par exemple: 200

Par exemple:

HttpStatus.SC_FORBIDDEN == 403 
EnglishReasonPhraseCatalog.INSTANCE.getReason(403, Locale.ENGLISH) == "Forbidden" 
0

Vous pouvez utiliser mon HttpStatus JSP Tag Libray:

<%@ page isErrorPage="true" %> 
<%@ taglib prefix="hs" uri="http://erik.thauvin.net/taglibs/httpstatus" %> 
<html><head> 
<title><hs:code/> <hs:reason default="Server Error"/></title> 
</head> 
<h1><hs:reason default="Server Error"/></h1> 
Cause: <pre><hs:cause default="Unable to complete your request."/></pre> 

Plus précisément, comme le montre l'exemple ci-dessus , la balise <hs:reason/> est utilisée pour afficher l'expression de raison (description lisible par l'homme) pour le statut HTTP actuel code dans le titre de la page et le premier titre.

En outre, la balise <hs:code/> est utilisée pour afficher le code d'état HTTP actuel et la balise <hs:cause/> pour afficher le message de l'exception à l'origine de l'erreur.

+0

S'il vous plaît entrer dans les détails pourquoi votre bibliothèque résout ce problème, en particulier. Chaque fois que vous publiez un extrait de code, cela aide à expliquer ce qu'il fait et pourquoi il résout le problème. –

Questions connexes