Domanda

Sto cercando di restituire un codice di errore 401 da una webapp per attivare un processo di autenticazione di base, ma tomcat sta dirottando la risposta per visualizzare la sua pagina di rapporto sullo stato. C'è un modo per impedire a Tomcat di farlo e lasciare che il codice di errore vada fino al browser?

UPDATE Il mio errore: ho dimenticato l'intestazione WWW-Authenticate

È stato utile?

Soluzione

L'impostazione dello stato di risposta su 401 indica solo al browser "proibito" e Tomcat visualizzerà la pagina di errore. Di per sé non attiverà il processo di autenticazione.

Per attivare l'autent, è necessario aggiungere un'altra intestazione alla risposta:

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

dove " MyApp " è il nome del dominio di autenticazione HTTP desiderato. Aggiungi quell'intestazione e il browser aprirà una finestra di dialogo di autenticazione e ritenterà la richiesta.

Dovresti essere consapevole che Tomcat avrà comunque inviato la pagina di errore insieme alle intestazioni, è solo che il browser non la visualizzerà finché la risposta contiene l'intestazione di autenticazione.

Altri suggerimenti

Non sei soddisfatto delle pagine di errore predefinite fornite con Tomcat? Puoi definire le tue pagine di errore personalizzate nel tuo file web.xml. Nell'esempio mostrato di seguito, definiamo 2 pagine Web - server_error.html e file_not_found.html - che verranno visualizzate quando il server rileva rispettivamente un errore 500 o un errore 404.

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

Tuttavia, tieni presente che l'ordine dei tag per il file web.xml è molto importante. Se l'ordine nel file web.xml non è corretto, Tomcat genererà errori all'avvio

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

È possibile che si verifichi la pagina di errore Tomcat perché non stai includendo informazioni sufficienti per consentire al tuo browser di fare ciò che desideri dopo. Anche se stai vedendo una pagina non avrà un codice di stato 200. Se controlli l'intestazione vedrai un 401 lì dentro. Ho il sospetto che sia il tuo browser a non sapere cosa fare dopo.

Non indichi nella tua domanda cosa vuoi che faccia il browser, ma forse devi includere ulteriori informazioni nell'intestazione HTTP del messaggio di errore 401. Puoi sovrascrivere i messaggi di errore predefiniti aggiungendo un nodo pagina di errore al tuo file web.xml. La posizione può essere un servlet o un JSP in modo da poter fornire una logica piuttosto che solo una pagina statica.

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

Le risposte sopra non sono chiare al 100%, quindi questo è ciò che mi ha aiutato. Ho avuto una pagina statica 401.html e ho riscontrato lo stesso problema del poster originale. Tutto quello che ho fatto è stato cambiare la pagina in una pagina 401.jsp e scaricarla proprio in alto:

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

Il seguente post su coderanch.com è servito da guida.

Quindi, in breve, la sezione pertinente di web.xml è simile a questa:

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

E 401.jsp si presenta così:

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

Perché non usare gli elementi login-config , vincolo di sicurezza e ruolo di sicurezza da web.xml per questo? Piccolo esempio:

<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 ciò gli utenti che vogliono visitare la tua / directory / in / directory / o una qualsiasi delle sue sottodirectory dovranno effettuare il login. L'accesso sarà concesso solo se l'utente ha il ruolo USER o ADMIN. Puoi impostarlo anche sulla directory principale in modo che tutti gli utenti dovranno prima effettuare il login.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top