Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    Semplificare la gestione degli errori 404, 401, ecc... + java.lang.Throwable

    In Java c'è la possibilità di gestire più comodamente gli errori 404, 401, ecc...?
    Al momento in web.xml scrivo:
    codice:
    <error-page>
        <!-- Risorsa non trovata. -->
    <error-code>404</error-code>
        <location>/404.jsp</location>
    </error-page>
    <error-page>
        <!-- Elenco delle directory vietate. -->
    <error-code>403</error-code>
        <location>/403.jsp</location>
    </error-page>
    <error-page>
        <!-- Login mancante. -->
    <error-code>401</error-code>
        <location>/401.jsp</location>
    </error-page>
    <error-page>
        <!-- Eccezione non catturata. -->
    <error-code>500</error-code>
        <location>/500.jsp</location>
    </error-page>
    <error-page>
        <!-- Metodo servlet non supportato. -->
    <error-code>503</error-code>
        <location>/503.jsp</location>
    </error-page>
    e poi genero tante pagine per ogni errore.
    Esiste la possibilità di semplificare un pochetto tutto quanto?
    Nella pagina .jsp c'è modo di scrivere solo il numero di errore che è stato generato?
    Su internet trovo anche questi codici?
    codice:
    <%@ page errorPage="error.jsp" %>
    codice:
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>
    Qual'è la differenza tra gli errori 4xx, 5xx e quelli di java.lang.Throwable?
    ciao
    Più pratica in futuro...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    e poi genero tante pagine per ogni errore.
    Esiste la possibilità di semplificare un pochetto tutto quanto?
    Certo. Innanzitutto, tecnicamente, non c'è nulla che vieta di passare dei parametri in query string alla stessa pagina.

    codice:
    <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/http-error.jsp?code=404</location>
    </error-page>
    
    <error-page>
        <error-code>403</error-code>
        <location>/WEB-INF/http-error.jsp?code=403</location>
    </error-page>
    
    ....

    E poi nella http-error.jsp esaminare il parametro passato.

    Se si vuole farlo, è lecito. Ma di per sé non serve. Le specifiche delle Servlet sono così "buone" che hanno considerato questi scenari. Quando a fronte di un <error-page> viene fatta la richiesta interna alla risorsa indicata in <location> (che potrebbe essere una jsp o una Servlet), la risorsa riceve una serie di "attributi" nel request scope speciali. Uno di questi ha la chiave "javax.servlet.error.status_code" ed è un Integer che rappresenta lo status code.
    Ma ce ne sono anche altri, basta documentarsi sulle specifiche ufficiali o altrove.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Qual'è la differenza tra gli errori 4xx, 5xx e quelli di java.lang.Throwable?
    Un conto sono gli errori a livello HTTP (causati da richieste errate del client o errori interni al server). Un altro conto sono le eccezioni scatenate da qualche parte all'interno del codice della applicazione.
    Ultima modifica di andbin; 04-10-2018 a 08:53
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Grazie mille andbin, gentilissimo come sempre. Su internet trovo scritto che si può anche usare questo codice per tutti gli errori 4xx e 5xx:
    codice:
    <error-page>
        <location>/error45.jsp</location>
    </error-page>
    ma sembra funzionare da Servlet 3.0 in poi. E' sufficiente modificare il doctipe del mio web.xml per poter usare il codice sopra?
    Al momento io ho questo:
    codice:
    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    <web-app>
        <display-name>Esercitazione 1</display-name>
    La mia idea è di usare javax.servlet.error.status_code, che se ho capito bene fornirebbe un intero del tipo 4xx e 5xx, in error45.jsp.
    Gli hosting free e non per java forniscono già il supporto per servlet 3.0 oppure no?
    Nel caso fosse rischioso avrebbe senso e funzionerebbe una cosa di questo tipo?
    codice:
    <error-page>
        <!-- Risorsa non trovata. -->
    <error-code>404</error-code>
        <location>/404.jsp</location>
    </error-page>
    <error-page>
        <location>/error45.jsp</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>
    In prativa sui server in cui non c'è il supporto per servlet 3.0 gestirei solo il 404.
    Sempre online trovo anche questo errore:
    codice:
    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/error.jsp</location>
    </error-page>
    ma sarebbe superfluo perché sarebbe la stessa cosa di questo, giusto?
    codice:
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>
    Creare in ogni progetto 3 pagine di errore sono tante ma meglio di ora.
    Il tuo suggerimento non è male, devo ammetterlo però esce un file web.xml lungo un chilometro.
    P.S.:
    Scrivere:
    codice:
    <%@ page errorPage="/error.jsp" %>
    o scrivere:
    codice:
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>
    è la stessa cosa e quindi posso omettere java.lang.Throwable nel file web.xml?
    Ultima modifica di giannino1995; 04-10-2018 a 22:17
    Più pratica in futuro...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Su internet trovo scritto che si può anche usare questo codice per tutti gli errori 4xx e 5xx:
    codice:
    <error-page>
        <location>/error45.jsp</location>
    </error-page>
    ma sembra funzionare da Servlet 3.0 in poi.
    Sì, è vero, è una nuova caratteristica introdotta nelle Servlet Specification 3.0. I tag <error-code> e <exception-type> sono diventati opzionali, puoi avere solo <location>.
    Se però hai solo il location quel <error-page> diventa in sostanza un "cattura tutto", quindi error-code E eccezioni. E a quel punto dovresti distinguere tu nella pagina se si arriva lì per un error code o una eccezione.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    E' sufficiente modificare il doctipe del mio web.xml per poter usare il codice sopra?
    Al momento io ho questo:
    codice:
    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    <web-app>
        <display-name>Esercitazione 1</display-name>
    Stai dichiarando le specifiche 2.3 che sono parecchio vecchie. Fino al 2.3 la struttura del web.xml era descritta con un DTD. Dalla versione 2.4 invece si usano gli schemi XML.

    Vedi ad esempio qui dove sono riportate le varie versioni:
    https://www.mkyong.com/web-developme...ptor-examples/

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    La mia idea è di usare javax.servlet.error.status_code, che se ho capito bene fornirebbe un intero del tipo 4xx e 5xx, in error45.jsp.
    Sì, quello è un attributo in request scope. Ce ne sono altri "speciali" che vengono forniti ad una risorsa che fa da "error" page handler.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Gli hosting free e non per java forniscono già il supporto per servlet 3.0 oppure no?
    Dipende dal servlet-container/application-server. Tomcat 7.0.x supporta Servlet 3.0. Vedi:
    https://tomcat.apache.org/whichversion.html

    Per altri basta documentarsi.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Nel caso fosse rischioso avrebbe senso e funzionerebbe una cosa di questo tipo?
    codice:
    <error-page>
        <!-- Risorsa non trovata. -->
    <error-code>404</error-code>
        <location>/404.jsp</location>
    </error-page>
    <error-page>
        <location>/error45.jsp</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>
    In questo momento non sono sicuro (dovrei rileggere le specifiche) se è lecito mettere un <error-page> "cattura tutto" insieme ad uno più specifico. Cioè, il mio dubbio ora è se quello più specifico (il 404) ha precedenza su quello generico.
    Credo di sì .... al limite basta provare ....

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    In prativa sui server in cui non c'è il supporto per servlet 3.0 gestirei solo il 404.
    Beh, scegli prima su cosa vuoi deployare. Tieni presente che le specifiche Servlet 3.0 sono del 2009. Quindi a meno di usare servizi/server moooooolto vecchi, le Servlet 3.x o superiori le hai di certo.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Sempre online trovo anche questo errore:
    codice:
    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/error.jsp</location>
    </error-page>
    ma sarebbe superfluo perché sarebbe la stessa cosa di questo, giusto?
    codice:
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>
    No, Throwable è più in "alto" (nella gerarchia) di Exception. E' solo questione di scegliere quale/i eccezioni gestire.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Scrivere:
    codice:
    <%@ page errorPage="/error.jsp" %>
    o scrivere:
    codice:
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>
    è la stessa cosa e quindi posso omettere java.lang.Throwable nel file web.xml?
    No

    <%@ page errorPage="/error.jsp" %>

    vuol dire che quella /error.jsp vale per quella JSP in cui hai la dichiarazione. Mentre il <error-page> con <exception-type> vale per le eccezioni in generale nella web application.


    P.S. le pagine di errore si mettono solitamente sotto WEB-INF, perché altrimenti sarebbero, tecnicamente, accessibili direttamente dal client. Che non sarebbe molto bello (a patto che un utente sappia quali siano, chiaramente).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Se questo:
    codice:
    <%@ page errorPage="/error.jsp" %>
    gestisce gli errori nella pagina mentre questo nella webapp:
    codice:
    <error-page>
        <location>/WEB-INF/error.jsp</location>
    </error-page>
    è ragionevole usare solo il secondo e omettere il primo, giusto?
    Come faccio a distinguere in error.jsp:
    1) Gli errori http;
    2) Gli altri errori.
    Se uso la variabile code potrei scrivere una cosa di questo tipo:
    codice:
    <%
        // Si cattura la variabile 'code' dall'URL.
        String errore = null;
        boolean httpError = true;
        try{
            errore = request.getParameterValues("code")[0];
        }catch(Exception e){
            httpError = false;
            errore = "";
        }
    %>
    <% if(httpError) {%>
    <h4>Errore <%= errore %></h4>
    <div>
        <img src="/immagini/http-error.jpg" alt="Errore <%= errore %>" class="imgResponsive">
        <p>Si &egrave; verificato il seguente errore http: <b><%= errore %></b></p>
        <p>Puoi ricollegarti alla home del sito <a href="/index.jsp">premendo qui</a>.</p>
    </div>
    <% } else {%>
    <h4>Errore</h4>
    <div>
        <img src="/immagini/webapp-error.jpg" alt="Errore" class="imgResponsive">
        <p>Siamo spiacenti, si &egrave; verificato un errore durante l'esecuzione:</p>
        <p>
            <%@ page isErrorPage="true"%>
            <%@ page import="java.io.StringWriter" %>
            <%@ page import="java.io.PrintWriter" %>
            <i>Messaggio:</i>
        </p>
        <p><strong class="rosso-porpora"><%=exception.getMessage()%></strong></p>
        <p><i>StackTrace:</i></p>
        <p class="grigio-40">
            <%
                StackTraceElement[] elements = Thread.currentThread().getStackTrace();
                for (int i = 0; i < elements.length; i++) {
                    StackTraceElement s = elements[i];
                    out.println(s + ")<br>");
                }
            %>
        </p>
        <p>Puoi ricollegarti alla home del sito <a href="/index.jsp">premendo qui</a>.</p>
    </div>
    <% } %>
    Ma il file web.xml diventerebbe troppo prolisso e non mi piace molto.
    Mi daresti una mano a preparare questo file error.jsp?
    Più pratica in futuro...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Se questo:
    codice:
    <%@ page errorPage="/error.jsp" %>
    gestisce gli errori nella pagina mentre questo nella webapp:
    codice:
    <error-page>
        <location>/WEB-INF/error.jsp</location>
    </error-page>
    è ragionevole usare solo il secondo e omettere il primo, giusto?
    Sì, è possibile avere solo 1 <error-page> con il solo <location> e così gestisci tutti gli errori/eccezioni.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Come faccio a distinguere in error.jsp:
    1) Gli errori http;
    2) Gli altri errori.
    PageContext ha un getErrorData() che fornisce un oggetto ErrorData. Se la pagina di errore ha il isErrorPage="true", i dati nel ErrorData sono validi e significativi (altrimenti non sono usabili).
    All'interno del ErrorData ci sono status-code e l'eccezione (e altro, vedi documentazione). Lo status-code c'è sempre, l'eccezione no, può mancare (=null).

    Quindi qualcosa del tipo:

    codice:
    <%@ page isErrorPage="true"  ....altri attributi....  %>
    
    ...
    
    <% if (pageContext.getErrorData().getThrowable() != null) { %>
    
       ... errore per eccezione ...
    
    <% } else { %>
    
       ... errore per status-code ...
    
    <% } %>
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Mille grazie. Riesco ad entrare in status-code e ad ottenere 404, gli altri errori non so se funzionano perché non so come generarli. Le eccezioni invece non riesco ad intercettarle. Ho scritto un errore in logout.jsp ma nel ciclo if non entro e vedo una pagina bianca in logout.jsp:

    codice:
    <% if (pageContext.getErrorData().getThrowable() != null) { %>
    <!-- Errore per eccezione. qui non entro mai!!! -->
    <div>
        <img src="/immagini/webapp-error.jpg" alt="Errore" class="imgResponsive">
        <p>Si &egrave;verificato un errore.</p>
        <p>Puoi ricollegarti alla home del sito <a href="/index.jsp#home">premendo qui</a>.</p>
    </div>
    <% } else { %>
    <!--... qui ok ...-->
    <% } %>
    Più pratica in futuro...

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Riesco ad entrare in status-code e ad ottenere 404, gli altri errori non so se funzionano perché non so come generarli.
    Causare deliberatamente (per prova) gli altri status code 4xx e 5xx non è detto che sia proprio facile/immediato o possibile.
    Il 404 è banale. Il 405 (Method Not Allowed) è anche abbastanza semplice: se hai una Servlet che ha solo il doPost, chiamala con un url a mano da browser (quindi un GET) e lo becchi.
    Altri ... è da valutare.
    Ma ti ripeto che un <error-page> con solo <location> cattura TUTTO, status code e eccezioni. Quindi se ti funziona per uno status code ... ti funziona pure per gli altri.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Le eccezioni invece non riesco ad intercettarle.
    Da un doGet/doPost lancia deliberatamente una qualunque eccezione che possa uscire fuori dal metodo (es. un RuntimeException).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Perché se scrivo questo:
    codice:
    HttpSession session = request.getSession(false);
    // Quando la sessione è scaduta non è impossibile invalidarla.
    if(session!=null) {
        session.invalidate();
    }
    session.invalidate();
    response.sendRedirect("/index.jsp#home");
    Il codice seguente non riesce ad intercettare l'errore e Java si pianta in logout.jsp?
    codice:
    <!-- Tutti gli altri errori. -->
    <error-page>
        <location>/error.jsp#ancora</location>
    </error-page>
    P.S.:Mi hai detto di mettere error.jsp dentro WEB-INF ma a me piace che resti fuori insieme alle altre pagine. Mi piace più così. Se l'utente scrive error.jsp legge errore 0 ma a me questo non infastidisce.
    Più pratica in futuro...

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
    if(session!=null) {
        session.invalidate();
    }
    session.invalidate();
    Innanzitutto perché c'è un invalidate() nel if e uno .. fuori?

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Il codice seguente non riesce ad intercettare l'errore e Java si pianta in logout.jsp?
    Si "pianta" ... dove? In che punto esattamente?
    E comunque per poter passare in modo "pulito" ad una pagina di errore c'è un requisito importante: la response non deve essere ancora "committed".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.