Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 26 su 26
  1. #21
    Ho terminato di scrivere la Servlet e funziona ma ho problemi con il filtro.
    Non capisco perché getSession(false) venga segnato in rosso da IntelliJ anche se l’oggetto javax.servlet.http.HttpSession sia stato correttamente importato. Questo avviso non mi permette di compilare l’applicazione.
    FiltroB.java
    codice:
    package web1;
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpSession;
    public class FiltroB implements Filter {
        public void init(FilterConfig arg0) throws ServletException {
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain) throws IOException, ServletException {
            HttpSession session = request.getSession(false);
            String SessionUserID = (String) session.getAttribute("UserID");
            if(SessionUserID == null){
                response.sendRedirect(String.format("%s%s", request.getContextPath(), "/index.jsp"));
            } else {
                response.sendRedirect(String.format("%s%s", request.getContextPath(), "/privatezone.jsp"));
            }
            try {
                chain.doFilter(request, response);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    
        }
        public void destroy() {
        }
    }
    LoginFiltrata.java
    codice:
    package web1;
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    @WebServlet(urlPatterns = "/privatezone.jsp")
    public class LoginFiltrata extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            HttpSession session = request.getSession();
            String SessionUserID = (String) session.getAttribute("UserID");
            String UserID = request.getParameter("UserID");
            String Password = request.getParameter("Password");
            if (SessionUserID==null){
                FromStringToHash HashText = new FromStringToHash(Password,"pall0");
                ServletContext context = getServletContext();
                String fullPath = context.getRealPath("/WEB-INF/users.txt");
                File fileUtenti = new File(fullPath);
                UserDB udb = new UserDB();
                udb.loadFile(fileUtenti);
                if (udb.authenticateUser(UserID, HashText.getHashText())) {
                    session.setAttribute("UserID", UserID);
                    SessionUserID = (String) session.getAttribute("UserID");
                }
            }
            if (SessionUserID!=null && SessionUserID.equals(UserID)) {
                response.setContentType("text/html");
                PrintWriter writer = response.getWriter();
                writer.println("<html><body>");
                writer.println("Benvenuto " + UserID + "!");
                writer.println("</body></html>");
                writer.close();
            } else {
                response.setContentType("text/html");
                PrintWriter writer = response.getWriter();
                writer.println("<html><body>");
                writer.println("Utente non registrato!");
                writer.println("</body></html>");
                writer.close();
            }
        }
    }
    Più pratica in futuro...

  2. #22
    chiedo scusa per l'ulteriore messaggio ma oggi il forum funziona male...
    Più pratica in futuro...

  3. #23
    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
    Non capisco perché getSession(false) venga segnato in rosso da IntelliJ anche se l’oggetto javax.servlet.http.HttpSession sia stato correttamente importato.
    Partiamo da alcuni concetti base sulla API delle Servlet. Hai già notato che esistono ServletRequest/ServletResponse e poi ci sono HttpServletRequest/HttpServletResponse ? E per le servlet: Servlet (interfaccia) e poi HttpServlet (classe) ?

    Quando hanno ideato la API delle Servlet hanno voluto stare un po' "ampi", si sono tenuti aperti la possibilità (teorica) che si possano usare le servlet anche in un contesto che non sia legato al protocollo HTTP.
    Ora, tutti i servlet container attuali come Tomcat o gli application server come JBoss, GlassFish di fatto sono legati ad HTTP.

    Quindi se lavori su web application Java è abbastanza/ragionevolmente scontato che si parli di HTTP e non di altro protocollo. Per le servlet hanno fatto questa "specializzazione", HttpServlet ha i doXXX che ricevono HttpServletRequest/HttpServletResponse.

    Per i filtri no, non hanno fatto questa specializzazione. Perché i filtri si possono usare per molti scopi "particolari" anche per agire su aspetti che magari non hanno direttamente a che fare con HTTP.
    C'è solo Filter e il doFilter riceve ServletRequest/ServletResponse. Ma dato che siamo in un contesto dove si usa HTTP, gli oggetti che doFilter riceve sono effettivamente quelli dei sottotipi HttpServletRequest/HttpServletResponse.

    Ora, il concetto di "sessione" è specifico di HTTP. Quindi i due getSession li trovi in HttpServletRequest e NON nella interfaccia più generica ServletRequest.

    Morale: nei filtri devi fare un cast da ServletRequest a HttpServletRequest per poter usare cose specifiche di HTTP.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
            HttpSession session = request.getSession(false);
            String SessionUserID = (String) session.getAttribute("UserID");
            if(SessionUserID == null){
                response.sendRedirect(String.format("%s%s", request.getContextPath(), "/index.jsp"));
            } else {
                response.sendRedirect(String.format("%s%s", request.getContextPath(), "/privatezone.jsp"));
            }
            try {
                chain.doFilter(request, response);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    
        }
    Ci sono comunque diverse cose che NON vanno.

    Il getSession(false) NON crea una nuova sessione. Se c'è, la restituisce. Se non c'è restituisce null. Quindi se non c'è la sessione tu hai un null e ovviamente NON puoi fare un session.getAttribute( .. ).
    Morale: un test sul reference lo devi fare!

    Poi non capisco perché fai due sendRedirect. Se non c'è l'utente loggato, devi solo fare un redirect ad una pagina che ha il form di login.

    E comunque tu fai un sendRedirect ma poi il codice procede con chain.doFilter. Quando viene eseguito il sendRedirect quel tuo doFilter non termina lì così ... Il codice procede. Quindi non devi fare sendRedirect e chain.doFilter. O uno o l'altro.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    LoginFiltrata.java
    La servlet di autenticazione mi sembra abbastanza contorta e fumosa, compreso il fatto che prima setti l'attributo e poi appena dopo lo riprendi. Dovresti cercare di ragionare di più e fare le cose in maniera più sensata.


    P.S. dovresti cercare di "studiare" e documentarti un po' di più. Ammesso anche che Java/programmazione ti interessano per il "futuro".
    Finché fai delle esercitazioni .. è un conto. Se un giorno dovessi proprio lavorare con Java, o trovi un contesto in cui "cazzeggiano" con la programmazione (ne ho già viste purtroppo di situazioni del genere) oppure se trovi un contesto altamente sfidante dal punto di vista tecnico (come mi è già capitato), se fai cose del genere o ti "massacrano" oppure ti mandano via ....
    Ultima modifica di andbin; 14-08-2018 a 10:13
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #24
    Ho corretto il codice, facendo il cast tutto funziona però non capisco a cosa serva questo Filtro se non a complicare inutilmente la programmazione. Inizialmente realizzavo con la sola Servlet il processo di autenticazione e funzionava tutto alla perfezione. Qual è l’utilità di spezzettare il processo di autenticazione in così tante classi? Dal punto di vista logico, a mio modesto avviso, è più comodo, lineare e semplice inserire il codice del Filtro insieme quello della Servlet!
    FiltroB.java
    codice:
    package web1;
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    public class FiltroB implements Filter {
        public void init(FilterConfig arg0) throws ServletException {
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain) throws IOException, ServletException {
            HttpSession session = ((HttpServletRequest) request).getSession();
            String SessionUserID = (String) session.getAttribute("UserID");
            if(SessionUserID == null){
                ((HttpServletResponse) response).
                        sendRedirect(String.format("%s%s", ((HttpServletRequest) request).getContextPath(), "/index.jsp"));
            }
            try {
                chain.doFilter(request, response);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        public void destroy() {
        }
    }
    LoginFiltrata.java
    codice:
    package web1;
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    @WebServlet(urlPatterns = "/privatezone.jsp")
    public class LoginFiltrata extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            HttpSession session = request.getSession();
            String UserID = request.getParameter("UserID");
            String Password = request.getParameter("Password");
            FromStringToHash HashText = new FromStringToHash(Password,"pall0");
            ServletContext context = getServletContext();
            String fullPath = context.getRealPath("/WEB-INF/users.txt");
            File fileUtenti = new File(fullPath);
            UserDB udb = new UserDB();
            udb.loadFile(fileUtenti);
            if (udb.authenticateUser(UserID, HashText.getHashText())) {
                session.setAttribute("UserID", UserID);
                response.setContentType("text/html");
                PrintWriter writer = response.getWriter();
                writer.println("<html><body>");
                writer.println("<p>Benvenuto " + UserID + "!</p>");
                writer.println("</body></html>");
                writer.close();
            } else {
                response.setContentType("text/html");
                PrintWriter writer = response.getWriter();
                writer.println("<html><body>");
                writer.println("<p>Utente non registrato!</p>");
                writer.println(" <a href=\"index.jsp\">Ritorna alla pagina di login.</a> ");
                writer.println("</body></html>");
                writer.close();
            }
        }
    }
    Non badare alle ripetizioni e all’html nel ciclo if, appena terminata l’autenticazione cerco di creare qualcosa di più bello (si accettano consigli).
    Dato che vorrei conservare la Servlet per uno scopo puramente didattico, vorrei creare dei pezzi di html salvati in opportune pagine .html da includere prima e dopo il messaggio di benvenuto.
    Creerò successivamente una nuova pagina in cui l’utente autenticato andrà ad inserire dei dati di input ma questa seconda pagina sarà una server page che mi piace di più con codice java aggiunto (un po’ come si fa con php).
    Più pratica in futuro...

  5. #25
    Ciao andbin, sei riuscito a leggere il messaggio? Io sto riscontrando problemi con il forum. Ricevo l’avviso che hai risposto, vedo come ultimo post il tuo messaggio ma nella discussione non trovo nulla. L’ultima tua risposta è del 14-08-2018, 07:55?
    Più pratica in futuro...

  6. #26
    Ciao Andbin, sto procedendo con l’esercitazione ma sono in alto mare. Stavo valutando di usare la Servlet solo per l’autenticazione e stop e quindi inserire nel ciclo if un redirect ad una pagina JSP fatta ad hoc in cui visualizzare il benvenuto insieme ad un altro form in cui inserire altri dati e fare altre cose oppure di visualizzare il messaggio di errore “utente non registrato”. In pratica vorrei fare una pagina in stile PHP ma non so come fare. Le dispense parlano di:
    Commenti
    Direttive
    Scriptlets
    JavaBeans

    ma a me non funziona nulla! Mi daresti ancora un piccolo aiuto?
    codice:
    <!DOCTYPE html>
    <html lang="it">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="description" content="Applicazione web per la gestione di coordinate spaziotemporali">
        <meta name="keywords" content="HTML,CSS,Java,Maven,JavaScript">
        <meta name="author" content="Nome Cognome">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Esercitazione 1</title>
        <link rel="stylesheet" type="text/css" href="css/tema.css">
    </head>
    <body>
    <%@ page import="java.lang.String" %>
    <%@ page import="java.io.File" %>
    <%@ page import="java.io.IOException" %>
    <%@ page import="java.io.PrintWriter" %>
    <%@ page import="javax.servlet.ServletContext" %>
    <%@ page import="javax.servlet.ServletException" %>
    <%@ page import="javax.servlet.annotation.WebServlet" %>
    <%@ page import="javax.servlet.http.HttpServlet" %>
    <%@ page import="javax.servlet.http.HttpServletRequest" %>
    <%@ page import="javax.servlet.http.HttpServletResponse" %>
    <%@ page import="javax.servlet.http.HttpSession" %>
    <%@ page import="java.lang.Object" %>
    <%
    // Recupero l'utente dalla sessione
    String UserID = request.getSession().getAttribute("UserID");
        if (UserID!=null){
    %><p>Welcome + <% out.println(request.getSession().getAttribute("UserID")); %></p>
    <% } else {%><p>Utente non registrato!</p>
    <a href="index.jsp">Ritorna alla pagina di login.</a>
    <% } %>
    Più pratica in futuro...

  7. #27
    Ho risolto tutto e la webapp funziona ma ho ancora 4 domande.

    1.Il filtro che verifica se esiste oppure no una data sessione attiva, ovvero la presenza di un attributo “user” diverso da null, va applicata su tutte le pagine private dell’utente (pagine jsp + Servlet) oppure solo sulla Servlet che esegue l’autenticazione (ovvero la classe che verifica le credenziali ed in caso positivo crea l’attributo di sessione)?

    2.Qual è il vantaggio nell’utilizzare il filtro quando posso verificare l’esistenza di una data variabile di sessione (attributo diverso da null ) nella stessa Servlet in cui eseguo l’autenticazione?

    3.Al contrario se eseguo una verifica dell’attributo di sessione nel filtro e anche nella Servlet o nella pagina jsp aumento la sicurezza dell’applicazione?

    4.La mia applicazione verifica le credenziali di un utente (es. Mario) e se sono corrette salva, con il comando session.setAttribute("user", xxx), il nome Mario in “user” (xxx è una string che contiene “Mario”). Una volta che “user” è diversa da null l’utente ha accesso a tutte le altre pagine del sito. In pratica ci sono delle pagine jsp del sito che posso essere visualizzare semplicemente dimostrando di avere l’attributo “user” diverso da null. Per paradosso anche un utente Luca, assente in database, potrebbe accedere alla pagina jsp. E’ vero che “user” viene impostato a Luca solo nella Servlet che esegue l’autenticazione e quindi la presenza di Luca nel database ma questo meccanismo non è un rischio per la sicurezza dell’applicazione?

    Grazie
    Più pratica in futuro...

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.