2009-10-28 6 views
8

Estoy en la situación en la que estoy escribiendo páginas de error personalizadas para una aplicación web (principalmente para reducir la divulgación de información de las páginas de error predeterminadas del contenedor de servlets). Como I necesita una página de error para cada código de estado de error, tendré que tener una respuesta sensata para cada código. Por lo que puedo decir, estas páginas de error no tienen que ser especialmente fáciles de usar, pero simplemente redirigir todo a una sola página de error "se salió mal" va a hacer que diagnosticar problemas sea muy difícil.¿Biblioteca de Java para mapear el código de estado HTTP a la descripción?

Así que me pregunto si hay una biblioteca Java que proporcione una buena asignación entre los códigos de estado HTTP y una breve descripción humana de ellos (idealmente un "resumen" de 2 a 4 palabras, para usar como título de página , así como un mensaje de 1-3 oraciones expandiendo el resumen). Entonces podría usar esto en un JSP para proporcionar algunos comentarios sobre la clase del error. Si no, estoy seguro de que puedo escribir uno, pero si las ruedas se han inventado, me alegra usarlas.

Respuesta

11

Así que me pregunto si hay una biblioteca de Java que proporciona una buena asignación entre los códigos de estado HTTP y una breve descripción legible de ellos (lo ideal sería un 2-4 palabra "Resumen", para usar como título de página, así como un mensaje de oración 1-3 que se amplía en el resumen ).

Sí, Apache Commons HttpClient tiene esta funcionalidad. La clase HttpStatus tiene la misma lista de constantes int que encontrará en otro lugar, pero también tiene un método static String getStatusText(int) que devuelve una descripción legible para humanos del código de estado.

Aquí es la dependencia Maven: Código

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

Ejemplo:

import org.apache.commons.httpclient.HttpStatus; 

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

Prints:

OK 
+0

¿Qué jar tengo que agregar a la ruta de compilación para utilizar este método? Los agregué a todos y ninguno de ellos funciona. –

+0

Para v4 de este proyecto de apache: httpComponents, consulte mi respuesta debajo de – Chaiavi

3

La clase abstracta 'HttpURLConnection' le proporciona valores int constantes para todos los códigos de estado HTTP. Su documentación tiene una breve descripción verbal para cada constante. Podría hacerse una enumeración simple con estos valores y cadenas, y usar eso.

1

Si usa Jersey (o lo tiene en su classpath), la enumeración javax.ws.rs.core.Response.Status incluye "razones" legibles por humanos de las especificaciones HTTP, p. Ej. Response.Status.fromStatusCode(404).toString() da "Not Found".

+4

¿Por qué 'Response.Status.fromStatusCode (405)' devuelve 'null'? – Stefan

+1

@Stefan: Acabo de pasar un tiempo golpeando mi cabeza contra esto también. NOT_ALLOWED simplemente no está incluido en Response.Status enum. Tenga en cuenta que, de hecho, hay una interfaz http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/Response.StatusType.html que le permite crear sus propios tipos de estado. Útil, pero solo si lo que está usando lo aceptará una instancia de StatusType en lugar de una instancia de Estado ... – PapaFreud

+0

@Stefan existe en 'ClientResponse.Status' y en' Responses.METHOD_NOT_ALLOWED_TYPE'. Terminé creando mi propia enumeración. – GuiSim

4

Tal vez la solución más fácil es utilizar la siguiente función:

httpResponse.getStatusLine().getReasonPhrase() 

vuelva exactamente lo que se necesita.

3

últimos componentes Apache HTTP v4 + (httpCoponents)

introduce las siguientes: httpStatus como una enumeración que contiene todos los httpStatuses

Para la descripción de su uso: EnglishReasonPhraseCatalog.INSTANCE.getReason (código, Locale. INGLÉS);

Cuando el código de estado == código, por ejemplo: 200

Por ejemplo:

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

Usted puede usar mi 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> 

Específicamente, como se muestra en el ejemplo anterior , la etiqueta <hs:reason/> se usa para mostrar la frase de razón (descripción legible por el ser humano) para el estado actual de HTTP código en el título de la página y primer título.

Además, la etiqueta <hs:code/> se utiliza para mostrar el código de estado HTTP actual y la etiqueta <hs:cause/> para mostrar el mensaje de la excepción que provocó el error.

+0

Por favor, entre en detalles por qué su biblioteca resuelve este problema, específicamente. Cada vez que publica un fragmento de código, ayuda a explicar qué está haciendo y por qué aborda el problema. –

Cuestiones relacionadas