2009-08-04 15 views
5

que estoy tratando de devolver un código de error 401 a partir de una aplicación web para desencadenar un proceso de autenticación básica, pero Tomcat es el secuestro de la respuesta a mostrar su página de informe de estado. ¿Hay una manera de prevenir Tomcat de hacer esto y dejar que el código de error de ir todo el camino hasta el navegador?informe de estado Tomcat

ACTUALIZACIÓN Mi error: Olvidé la cabecera WWW-Authenticate

+1

Tomcat no está secuestrando nada, si regreso la página de informe de estado predeterminado, entonces simplemente no lo configuró correctamente Acabo de leer la documentación correcta – Peter

+0

No quiero que tomcat muestre ninguna página de error –

Respuesta

5

Configurar el estado de respuesta a 401 solo indicará al navegador "prohibido", y tomcat mostrará la página de error. En sí mismo no activará el proceso de autenticación.

para activar autenticación, es necesario añadir otra cabecera de la respuesta:

httpResponse.setHeader("WWW-Authenticate", "Basic realm=\"MyApp\""); 

donde "MyApp" es el nombre de su dominio de autenticación HTTP deseado. Agregue ese encabezado, y el navegador mostrará un cuadro de diálogo de autenticación y reintentará la solicitud.

Debe tener en cuenta que Tomcat todavía haber enviado a la página de error junto con las cabeceras, es sólo que el navegador no mostrará todo el tiempo que la respuesta contiene el encabezado de autenticación.

3

Descontento con las páginas de error por defecto que vienen con Tomcat? Puede definir sus propias páginas de error personalizadas en su archivo web.xml. En el ejemplo se muestra a continuación, definimos 2 páginas web - server_error.html y file_not_found.html - que se mostrarán cuando el servidor encuentra un error 500 o un error 404, respectivamente.

<error-page> 
    <error-code>500</error-code> 
    <location>/server_error.html</location> 
</error-page> 
<error-page> 
    <error-code>404</error-code> 
    <location>/file_not_found.html</location> 
</error-page> 

Sin embargo, debe tener en cuenta que el orden de las etiquetas para el archivo web.xml es muy importante. Si el orden en el archivo web.xml es incorrecta, Tomcat errores de salida en el arranque

fuente: http://linux-sxs.org/internet_serving/c581.html

+0

No, no quiero que tomcat muestre ninguna página de error –

+1

@Maurice Perry, creo que lo que Peter está tratando de decirte es que debes configurar tus páginas de error de la manera que él ha mencionado. Pero en sus páginas de error, puede hacer un redireccionamiento a una página de autenticación, donde le pide al usuario que especifique sus credenciales. –

3
página de error

El Tomcat podría estar sucediendo porque no está incluida la información suficiente para su navegador para hacer lo quieres el próximo Aunque está viendo una página, no tendrá un código de estado de 200. Si inspecciona el encabezado, verá un 401 allí. Sospecho que es su navegador el que no sabe qué hacer a continuación.

usted no indica en su pregunta lo que quiere el navegador para hacer, pero tal vez lo que necesita para incluir información adicional en la cabecera HTTP del mensaje de error 401. Puede anular los mensajes de error predeterminados agregando un nodo error-page a su archivo web.xml. La ubicación puede ser un servlet o un JSP para que pueda proporcionar algo de lógica en lugar de solo una página estática.

<error-page> 
    <error-code>401</error-code> 
    <location>/my401.jsp</location> 
</error-page> 
0

Por qué no usar el login-config, seguridad en restricciones y seguridad en roles elementos de web.xml para esto? Pequeño ejemplo:

<login-config> 

    <auth-method>FORM</auth-method> 

    <realm-name>Your-Name</realm-name> 

    <form-login-config> 

    <form-login-page>/login.jsp</form-login-page> 

    <form-error-page>/error_login.xhtml</form-error-page> 

    </form-login-config> 

</login-config> 


<security-constraint> 

    <web-resource-collection> 

     <web-resource-name>Some-Name</web-resource-name> 

     <url-pattern>/path/to/directory/*</url-pattern> 

    </web-resource-collection> 

    <auth-constraint> 

     <role-name>USER</role-name> 

     <role-name>ADMIN</role-name> 

    </auth-constraint> 

</security-constraint> 


<security-role> 

    <description>Role for all users</description> 

    <role-name>USER</role-name> 

</security-role> 


<security-role> 

    <description>role for all admins</description> 

    <role-name>ADMIN</role-name> 

</security-role> 

Con que los usuarios que quieran visitar su/ruta/al/directorio/o cualquiera de sus subdirectorios se necesitan para iniciar sesión. El acceso solo se otorgará si el usuario tiene el rol de USUARIO o ADMINISTRADOR. Puede configurar esto incluso en el directorio raíz para todos los usuarios tendrán que identificarse ..

+0

La autenticación básica es un requisito. Es una larga historia ... –

1

Las respuestas anteriores no son 100% claro, así que esto es lo que me ayudó. Tenía una página estática 401.html y experimenté el mismo problema que el póster original. Todo lo que hice fue cambiar la página a 401.página JSP y volcar este derecho en la parte superior:

<% 
String realmName = "A nice name to show as the title of on the pop-up"; 
response.setHeader("WWW-Authenticate","Basic realm=\"" + realmName + "\""); 
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
%> 

El following post on coderanch.com sirvieron como guía.

Así, en pocas palabras, la sección pertinente de web.xml se parece a esto:

<!-- Internal server error. --> 
    <error-page> 
    <error-code>500</error-code> 
    <location>/errors/500.html</location> 
    </error-page> 

    <!-- Not found. --> 
    <error-page> 
    <error-code>404</error-code> 
    <location>/errors/404.html</location> 
    </error-page> 

    <!-- Unauthorized. --> 
    <error-page> 
    <error-code>401</error-code> 
    <location>/errors/401.jsp</location> 
    </error-page> 

Y 401.jsp se parece a esto:

<% 
String realmName = "A nice name to show as the title of on the pop-up"; 
response.setHeader("WWW-Authenticate","Basic realm=\"" + realmName + "\""); 
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>401 Unauthorized</title> 
<meta name="description" content="The server has not found anything matching the Request-URI."> 
<style type="text/css"> 
body {background-color:ffffff;background-image:url(http://);background-repeat:no-repeat;background-position:top left;background-attachment:fixed;} 
h3{font-family:Arial;color:000000;} 
p {font-family:Arial;font-size:14px;font-style:normal;font-weight:normal;color:000000;} 
</style> 
</head> 
<body> 
<h3>401 Unauthorized</h3> 
<p>The request requires authentication.</p> 
</body> 
</html> 
+0

Esto funcionó muy bien para mí. Solo, tengo un problema, cuando presiono el botón * Cancelar * o no puedo autenticarme correctamente en la ventana emergente de autorización ** BÁSICA **, como resultado obtengo una página en blanco. ¿Has podido encontrar una solución para este caso también? – Igor