2009-08-04 4 views
5

J'essaie de renvoyer un code d'erreur 401 à partir d'une application Web pour déclencher un processus d'authentification de base, mais Tomcat détourne la réponse pour afficher sa page de rapport d'état. Existe-t-il un moyen d'empêcher Tomcat de faire cela et de laisser le code d'erreur aller jusqu'au navigateur?Éviter le rapport d'état de tomcat

MISE À JOUR Mon erreur: J'ai oublié l'en-tête WWW-Authenticate

+1

tomcat est rien détournement d'avion, si ce retour la page de rapport d'état par défaut alors vous ne l'avez pas configurée correctement Il suffit de lire la documentation correcte – Peter

+0

Je ne veux pas que tomcat affiche une quelconque page d'erreur –

Répondre

5

Réglage de l'état de réponse à 401 ne fera que dire au navigateur « interdit », et tomcat affichera la page d'erreur. Cela ne déclenchera pas en soi le processus d'authentification.

Pour déclencher auth, vous devez ajouter une autre tête à la réponse:

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

où « MyApp » est le nom de votre domaine auth HTTP désiré. Ajoutez cet en-tête et le navigateur affichera une boîte de dialogue d'authentification et réessayera la demande.

Vous devez être conscient que tomcat aura toujours envoyé la page d'erreur avec les en-têtes, c'est juste que le navigateur ne l'affichera pas tant que la réponse contient l'en-tête auth.

3

Malheureux avec les pages d'erreur par défaut qui viennent avec Tomcat? Vous pouvez définir vos propres pages d'erreur personnalisées dans votre fichier web.xml. Dans l'exemple ci-dessous, nous définissons 2 pages Web - server_error.html et file_not_found.html - qui seront affichées lorsque le serveur rencontre une erreur 500 ou une erreur 404 respectivement.

<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> 

Vous devez garder à l'esprit, cependant, que l'ordre des balises pour le fichier web.xml est très important. Si l'ordre dans votre fichier web.xml est incorrect, Tomcat erreurs de sortie au démarrage

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

+0

Non, je ne veux pas que tomcat affiche une page d'erreur quelconque –

+1

@Maurice Perry, je crois que ce que Peter essaie de vous dire, c'est que vous devriez configurer vos pages d'erreur de la façon dont il a mentionné. Mais dans vos pages d'erreur, vous pouvez faire une redirection vers une page d'authentification, où vous demandez à l'utilisateur de spécifier ses informations d'identification. –

3

La page d'erreur Tomcat pourrait se produire parce que vous n'êtes pas compris assez d'informations pour votre navigateur pour faire ce que vous voulez le prochain. Même si vous voyez une page, il n'y aura pas de code d'état 200. Si vous inspectez l'en-tête, vous verrez un 401. Je suppose que c'est votre navigateur qui ne sait pas quoi faire ensuite.

Vous n'indiquez pas dans votre question ce que le navigateur doit faire, mais vous devez peut-être inclure des informations supplémentaires dans l'en-tête HTTP du message d'erreur 401. Vous pouvez remplacer les messages d'erreur par défaut en ajoutant un noeud error-page à votre fichier web.xml. L'emplacement peut être une servlet ou une JSP, vous pouvez donc fournir une logique plutôt qu'une page statique.

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

Pourquoi ne pas utiliser la connexion -config, sécurité contrainte et sécurité rôle éléments de web.xml pour cela? Petit exemple:

<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> 

Avec que les utilisateurs qui veulent visiter votre/chemin/vers/répertoire/ou l'un de ses sous-répertoires devront ouvrir une session. L'accès ne sera accordé que si l'utilisateur a le rôle USER ou ADMIN. Vous pouvez définir cela même dans le répertoire racine de sorte que tous les utilisateurs devront d'abord se connecter ..

+0

L'authentification de base est une exigence. C'est une longue histoire ... –

1

Les réponses ci-dessus ne sont pas 100% claires, alors c'est ce qui m'a aidé. J'avais une page statique 401.html et j'ai rencontré le même problème que l'affiche originale. Tout ce que j'ai fait était de changer la page en 401.la page jsp et vider ce droit en haut:

<% 
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); 
%> 

Le following post on coderanch.com servi de guide.

Donc, en résumé, la section pertinente de web.xml ressemble à ceci:

<!-- 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> 

Et 401.jsp ressemble à ceci:

<% 
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

Cela a bien fonctionné pour moi. Juste, j'ai un problème, quand j'appuie sur le bouton * Annuler * ou ne réussit pas à m'authentifier correctement sur le popup d'autorisation ** BASIC **, comme résultat je reçois la page blanche. Avez-vous été capable de trouver une solution pour ce cas également? – Igor

Questions connexes