Visualizzazione dei risultati da 1 a 10 su 27

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Il file .txt l'ho corretto in queto modo:
    codice:
    Topolino,34363636,
    Pippo,79be4d06440,
    Pluto,be2d31669640,
    Paperino,c63c93bb1032a5,
    Più che ragionevole.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Hai detto che il processo di autenticazione deve essere fatto nella Servlet così oggi posso provare a creare uno script che verifichi se la user e la password inserite siano presenti nel file .txt.
    Ok, se hai dubbi chiedi. Ma l'importante è che ti sia chiaro a cosa potrebbe servire un Filter in questo contesto. Il Filter NON serve per "autenticare" un utente al login (questo lo deve fare una Servlet). Serve invece per impedire che un utente non autenticato possa accedere a risorse accessibili solo ad utenti autenticati. E fare questo generalmente implica anche l'uso delle "sessioni".
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  2. #2
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Più che ragionevole.


    Ok, se hai dubbi chiedi. Ma l'importante è che ti sia chiaro a cosa potrebbe servire un Filter in questo contesto. Il Filter NON serve per "autenticare" un utente al login (questo lo deve fare una Servlet). Serve invece per impedire che un utente non autenticato possa accedere a risorse accessibili solo ad utenti autenticati. E fare questo generalmente implica anche l'uso delle "sessioni".
    Sempre grazie. Ho sostituito le virgole con spazi, forse è meglio e ho scritto questo:
    1.File .txt:
    codice:
    Topolino c3cd7...
    Pippo 1ffeef258...
    Pluto 47e57669d...
    Paperino 1032a50ac...
    2.Servlet
    codice:
    FromTxtToMatrix rf = new FromTxtToMatrix();
    rf.LeggiFile("WEB-INF/users.txt");
    3.Classe del package
    codice:
    package web1;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FromTxtToMatrix {
    
        private String[][] Matrice;
    
        public String[][] LeggiFile(String File) throws IOException {
            FileReader f = new FileReader(File);
            BufferedReader b = new BufferedReader(f);
            int Riga = 0;
            String[] VettoreRiga;
            String StringaRiga = null;
            while(true) {
                StringaRiga=b.readLine();
                if(StringaRiga == null)
                    break;
                VettoreRiga = StringaRiga.split(" ");
                Matrice[Riga++] = VettoreRiga;
            }
            System.out.println(Matrice);
            return Matrice;
        }
    }
    Ottengo però questo errore:
    codice:
    java.io.FileNotFoundException: WEB-INF\users.txt (Impossibile trovare il percorso specificato)
    Ho provato a scrivere:
    codice:
    rf.LeggiFile("..\..\users.txt");
    ma neppure questo funziona:
    codice:
    java.io.FileNotFoundException: ..\..\users.txt (Impossibile trovare il percorso specificato)
    Non riesco a capire come ottenere la URL corretta. Il file si trova dentro WEB-INF\users.txt.
    ciao
    Ultima modifica di giannino1995; 10-08-2018 a 16:58
    Più pratica in futuro...

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Ho sostituito le virgole con spazi, forse è meglio
    Nì (sì e no). Il punto è che se nel codice fai lo split per 1 solo spazio esatto e chi edita il file non "sapesse" questo particolare preciso e magari un po' artisticamente si mette ad allineare la seconda colonna .... si sballa tutto il parsing del file.
    Quindi se proprio vuoi usare gli spazi, fai la separazione per "uno o più spazi" (cosa banale con una regex per split() di String).

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
    FromTxtToMatrix rf = new FromTxtToMatrix();
    rf.LeggiFile("WEB-INF/users.txt");
    Quello che hai usato sopra è un percorso "relativo" (alla directory corrente). Nelle webapp Java con i servlet container/application server, la directory "corrente" è parecchio vaga, nel senso che dipende da svariati fattori: da quale server è, da come/da dove viene avviato e altro.
    Detto in generale, nelle webapp la directory corrente NON è "usabile". A meno che si abbia pieno controllo e conoscenza su come/dove viene avviato il server, cosa possibile ma non sempre (ad esempio se il server non fosse gestito da te o di tua proprietà).

    Se il file deve stare "dentro" l'applicazione, o lo tratti come "risorsa" (nel senso della ricerca tramite classloader come inteso dai getResource/getResourceAsStream di java.lang.Class) ... o usi altro come il getRealPath di ServletContext (ma attenzione, la applicazione deve essere deployata spacchettata, non servita direttamente da un .war).

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
    public class FromTxtToMatrix {
    
        private String[][] Matrice;
    
        public String[][] LeggiFile(String File) throws IOException {
            FileReader f = new FileReader(File);
            BufferedReader b = new BufferedReader(f);
            int Riga = 0;
            String[] VettoreRiga;
            String StringaRiga = null;
            while(true) {
                StringaRiga=b.readLine();
                if(StringaRiga == null)
                    break;
                VettoreRiga = StringaRiga.split(" ");
                Matrice[Riga++] = VettoreRiga;
            }
            System.out.println(Matrice);
            return Matrice;
        }
    }
    Per niente buono. Sia per le denominazioni, sia per l'uso di una matrice. E tra l'altro (non te ne sei accorto), dove viene istanziata la matrice?? Appunto ...

    Allora: o fai un design diverso, dove la classe è specifica per il "db" degli utenti e "sa" anche DOVE si trova il file. Qualcosa del tipo abbozzato:

    codice:
    public class UserAuthentication {
        // .....
    
        public void authenticate(String username, String password) {
            // cerca lo username nel file
            // se trovato, verifica il match degli hash
            // Nota: per errori, lancia fuori eccezioni.
        }
    }

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    rf.LeggiFile("..\..\users.txt");
    Neanche, per quanto detto prima.



    P.S. devi chiarirti le idee su Object Oriented e sul design delle classi.
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    devo usare una treemap, chiedo scusa...
    Più pratica in futuro...

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
    D:\...\WEB-INF\users.txt
    java.lang.NullPointerException
    Ma il problema non è il percorso. Il problema è la gestione della matrice!

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    devo usare una treemap, chiedo scusa...
    Per cosa? Per associare l'utente al hash? E' richiesto espressamente?
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ma il problema non è il percorso. Il problema è la gestione della matrice!


    Per cosa? Per associare l'utente al hash? E' richiesto espressamente?
    Mi piace molto la TreeMap perché ha dei metodi comodi che mi facilitano il lavoro come conainsValue(). Tu mi consigli di riscrivere tutto con gli array? Ho scritto il modulo di autenticazione nella servlet lascindo per ora sospeso il discorso delle sessioni. Mi funziona tutto tranne questo metodo:
    codice:
    public boolean CercaUtente(TreeMap<Integer,String[]> Matrice, String [] VettoreRiga) {
        return Matrice.containsValue(VettoreRiga);
    }
    Uso CercaUtente per verificare se in TreeMap esiste un dato utente. In pratica i valori della TreeMap sono degli array di stringhe che contengono nome utente più password convertita in hash. Se scrivo:
    codice:
    boolean vero = false;
    vero = rf.CercaUtente(Matrice, Utente);
    System.out.println(vero);
    Ottengo false ma ti assicuro che Utente esiste in Matrice. Se scrivo:
    codice:
    System.out.println(Matrice.get(0)[0]);
    System.out.println(Matrice.get(0)[1]);
    System.out.println(Utente[0]);
    System.out.println(Utente[1]);
    System.out.println(Matrice.get(0).length);
    System.out.println(Utente.length);
    System.out.println(Matrice.get(0).equals(Utente));
    ottengo questo:
    codice:
    Topolino
    04b17b4383
    Topolino
    04b17b4383
    2
    2
    false
    Ultima modifica di giannino1995; 11-08-2018 a 18:06
    Più pratica in futuro...

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Mi piace molto la TreeMap perché ha dei metodi comodi che mi facilitano il lavoro come conainsValue().
    Tutte le implementazioni di java.util.Map hanno il containsValue(Object value) perché è già definito nella interfaccia di astrazione. Non solo TreeMap.
    Se devi associare il nome utente al hash della password, se vuoi fare il lookup (ricerca dell'utente) in maniera "veloce", sarebbe meglio HashMap perché è basata su hash-table interna. TreeMap è meno veloce in questo perché organizza le entry in un albero binario "ordinato" e deve fare potenzialmente svariate comparazioni prima di arrivare a trovare la chiave.

    Il vantaggio di TreeMap su HashMap è che TreeMap è una collezione "sorted", ovvero mantiene ordinate le chiavi e l'iterazione per chiave è appunto ordinata con quel tal criterio (dato da Comparable o Comparator).

    E comunque, tornando al containsValue(), se il valore nella mappa fosse il solo hash, allora containsValue() NON ti serve. Tu non devi andare a cercare un hash! Ci potrebbero essere due utenti che hanno password DIVERSE ma che danno lo STESSO hash. Si chiama "collisione" negli algoritmi di hashing, ed è possibile. Ovviamente più l'algoritmo di hashing è buono e dà un hash di lunghezza maggiore ... e meno è la probabilità di collisioni.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
    public boolean CercaUtente(TreeMap<Integer,String[]> Matrice, String [] VettoreRiga) {
        return Matrice.containsValue(VettoreRiga);
    }
    E in quel TreeMap<Integer,String[]> la chiave (quel Integer) cosa è??

    No, contorto e comunque non ti funziona. Il containsValue fa i confronti tra il valore ricevuto e i valori nella mappa usando equals(). Ma i tuoi valori sono degli array. E negli array il equals() NON è stato ridefinito, rimane quello ereditato da Object, che si basa solo sulla "identità" degli oggetti.
    Quindi NON va bene. (questa cosa degli array "dovresti" già saperla).
    Andrea, Senior 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 © 2026 vBulletin Solutions, Inc. All rights reserved.