2009-08-10 14 views
0

arbeiten I 2 Filter geschrieben haben 1 für einen normalen Benutzer und 1 für ein Admin noch müssen Sie sich anmelden Admin sein. Hier ist die Quelle für meine beiden Filter:Filter Hilfe - Erste 2 Filter miteinander

public class newFilter implements Filter { 
String UUIDInDB; 
String UUIDInCookie; 

public void init(FilterConfig filterConfig) throws ServletException { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) servletRequest; 
    HttpServletResponse res = (HttpServletResponse) servletResponse; 

    Cookie[] cookies = req.getCookies(); 

    UUIDInCookie = getCookieValue(cookies,"pubweb", "noCookie"); 

    if(UUIDInCookie.equals("noCookie")){ 
     Cookie cookie = new Cookie("pubweb","noCookie"); 
     cookie.setMaxAge(1); 
     res.addCookie(cookie); 
     res.sendRedirect("../Login.jsp"); 
     return ; 
    } 

    checkDatabase(); 

    if(UUIDInCookie.equals(UUIDInDB)){ 
     filterChain.doFilter(servletRequest, servletResponse); 
     System.out.println("Is allowed thorugh"); 
    } else if(UUIDInCookie.equals("noCookie")){ 
     res.sendRedirect("../Login.jsp"); 
     System.out.println("Isn't allowed thorugh");    
    } else { 
     res.sendRedirect("../Login.jsp"); 
     System.out.println("Isn't allowed thorugh"); 
    } 
} 

public void destroy() { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 

public void checkDatabase(){ 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 

    /* 
    The next lines allow you to change the username and password for the password. 
    */ 
    String username = "username"; 
    String password = "password"; 

    /* 
    The following line is the url. This can be changed to bring in to line with the database. 
    */ 
    String dbURL = "jdbc:mysql://localhost/hpsgdb?user=" 
      + username + "&password=" + password; 
    /* 
    This line connects to the database to the information presented earlier. 
    */ 

    java.sql.Connection myConnection = null; 
    try { 
     myConnection = DriverManager.getConnection(dbURL); 
     System.out.println("Connected to Database."); 
    } catch (SQLException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
    /* 
    The next line creates a query on the database. The query is that you want exacuted is on the next line. 
    */ 
    Statement stat = null; 
    try { 
     stat = (Statement) myConnection.createStatement(); 
    } catch (SQLException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } catch (NullPointerException e){ 
     e.printStackTrace(); 
    } 

    try { 
     ResultSet rs; 
     rs = stat.executeQuery("SELECT * from uuid where uuid='" + UUIDInCookie + "';"); 
     System.out.println("Executed Query."); 
     int count = 0; 
     while(rs.next()) 
     UUIDInDB = rs.getString("uuid") ; 
     System.out.println(UUIDInDB); 
     rs.close(); 
     myConnection.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } catch (NullPointerException e){ 
     e.printStackTrace(); 
    } 
} 

public static String getCookieValue(Cookie[] cookies, 
            String cookieName, 
            String defaultValue) throws IOException { 
    int length = cookies.length; 
    System.out.println(length); 
    try{ 
    for(int i=0; i<length; i++) { 
     Cookie cookie = cookies[i]; 
     if (cookieName.equals(cookie.getName())) { 
      System.out.println(cookies.length); 
      return(cookie.getValue()); 
     } else { 
      return defaultValue; 
     } 
    } } catch (NullPointerException e){ 
     e.printStackTrace(); 
     HttpServletResponse res = null; 
     res.sendRedirect("../Login.jsp"); 
    } 
    return(defaultValue); 
} 
} 

Weitere Filter:

public class adminFilter implements Filter { 
String UUIDInDB; 
String UUIDInCookie; 
int role; 

public void destroy() { 
} 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException { 
    HttpServletRequest req = (HttpServletRequest) servletRequest; 
    HttpServletResponse res = (HttpServletResponse) servletResponse; 

    Cookie[] cookies = req.getCookies(); 

    UUIDInCookie = getCookieValue(cookies,"pubweb", "noCookie"); 
    // role = Integer.parseInt(getCookieValue(cookies,"pubwebRole", "2")); 

    if(UUIDInCookie.equals("noCookie")){ 
     Cookie cookie = new Cookie("pubweb","noCookie"); 
     cookie.setMaxAge(1); 
     res.addCookie(cookie); 
     res.sendRedirect("../Login.jsp"); 
     return ; 
    } 

    checkDatabase(); 

    if(UUIDInCookie.equals(UUIDInDB) && role == 1){ 
     chain.doFilter(servletRequest, servletResponse); 
    } else if(UUIDInCookie.equals("noCookie")){ 
     res.sendRedirect("../Login.jsp"); 
    } else if (role == 2){ 
     res.sendRedirect("/"); 
    } else { 
     res.sendRedirect("../Login.jsp"); 
    } 
} 

public void init(FilterConfig config) throws ServletException { 

} 

public void checkDatabase(){ 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 

    /* 
    The next lines allow you to change the username and password for the password. 
    */ 
    String username = "username"; 
    String password = "password"; 

    /* 
    The following line is the url. This can be changed to bring in to line with the database. 
    */ 
    String dbURL = "jdbc:mysql://localhost/hpsgdb?user=" 
      + username + "&password=" + password; 
    /* 
    This line connects to the database to the information presented earlier. 
    */ 

    java.sql.Connection myConnection = null; 
    try { 
     myConnection = DriverManager.getConnection(dbURL); 
     System.out.println("Connected to Database."); 
    } catch (SQLException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
    /* 
    The next line creates a query on the database. The query is that you want exacuted is on the next line. 
    */ 
    Statement stat = null; 
    try { 
     stat = (Statement) myConnection.createStatement(); 
    } catch (SQLException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } catch (NullPointerException e){ 
     e.printStackTrace(); 
    } 

    try { 
     ResultSet rs; 
     rs = stat.executeQuery("SELECT * from uuid where uuid='" + UUIDInCookie + "';"); 
     System.out.println("Executed Query."); 
     int count = 0; 
     while(rs.next()) { 
     UUIDInDB = rs.getString("uuid") ; 
     role = rs.getInt("role"); 
     } 
     System.out.println(UUIDInDB); 
     System.out.println("Role =" + role); 
     rs.close(); 
     myConnection.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } catch (NullPointerException e){ 
     e.printStackTrace(); 
    } 
} 

public static String getCookieValue(Cookie[] cookies, 
            String cookieName, 
            String defaultValue) throws IOException { 
    int length = cookies.length; 
    System.out.println(length); 
    try{ 
    for(int i=0; i<length; i++) { 
     Cookie cookie = cookies[i]; 
     if (cookieName.equals(cookie.getName())) { 
      System.out.println(cookies.length); 
      return(cookie.getValue()); 
     } else { 
      return defaultValue; 
     } 
    } } catch (NullPointerException e){ 
     e.printStackTrace(); 
     HttpServletResponse res = null; 
     res.sendRedirect("../Login.jsp"); 
    } 
    return(defaultValue); 
} 

} 

Hier ist meine Web-XML-Datei:

<filter> 
    <filter-name>SecurityFilter</filter-name> 
    <filter-class>filters.newFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SecurityFilter</filter-name> 
    <url-pattern>/add/addAuthor.jsp</url-pattern> 
    <url-pattern>/add/addAuthor</url-pattern> 
    <url-pattern>/add/addConference.jsp</url-pattern> 
    <url-pattern>/add/addConference</url-pattern> 
    <url-pattern>/add/addJournal.jsp</url-pattern> 
    <url-pattern>/add/addJournal</url-pattern> 
    <url-pattern>/add/addWorkshop.jsp</url-pattern> 
    <url-pattern>/add/addWorkshop</url-pattern> 
    <url-pattern>/add/index.jsp</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>AdminFilter</filter-name> 
    <filter-class>filters.adminFilter</filter-class> 
</filter> 
<!-- <filter-mapping> 
    <filter-name>AdminFilter</filter-name> 
    <url-pattern>/add/addAuthor.jsp</url-pattern> 
    <url-pattern>/add/addAuthor</url-pattern> 
    <url-pattern>/add/addConference.jsp</url-pattern> 
    <url-pattern>/add/addConference</url-pattern> 
    <url-pattern>/add/addJournal.jsp</url-pattern> 
    <url-pattern>/add/addJournal</url-pattern> 
    <url-pattern>/add/addWorkshop.jsp</url-pattern> 
    <url-pattern>/add/addWorkshop</url-pattern> 
    <url-pattern>/add/index.jsp</url-pattern> 
    <url-pattern>/add/addConfJour.jsp</url-pattern> 
    <url-pattern>/add/addConfJourn</url-pattern> 
    <url-pattern>/add/addUser.jsp</url-pattern> 
    <url-pattern>/add/addUser</url-pattern> 
    <url-pattern>/add/addTag.jsp</url-pattern> 
    <url-pattern>/add/addTag</url-pattern> 
    <url-pattern>/add/indexAdmin.jsp</url-pattern> 
</filter-mapping>--> 

<filter-mapping> 
    <filter-name>AdminFilter</filter-name> 
    <url-pattern>/add/*</url-pattern> 
</filter-mapping> 

Vielen Dank im Voraus Dean

+0

was ist Ihre Frage? – dfa

+2

"Hier ist mein Code. Machen Sie es, Minion" – skaffman

+0

Nun kann ich nicht herausfinden, warum, wenn ich mit einem non-Admin-Konto anmelden es funktioniert noch nicht, wenn ich es funktioniert. – Dean

Antwort

0

Sind Sie sicher, dass Sie wirklich Ihre eigene Zugriffssicherheit implementieren möchten? Die Servlet-Spezifikation unterstützt geschützte Ressourcen, mit denen Sie im Wesentlichen tun können, was Sie tun. Sie möchten möglicherweise weiterhin einen Filter schreiben, um ein Benutzerobjekt in die Sitzung einzufügen. mit Container-Authentifizierung

Werfen Sie einen Blick auf diesen Link http://www.informit.com/articles/article.aspx?p=24253 auf Zugriff auf Web-Ressourcen zu schützen.

auch auf den Code Blick gibt es ein paar Dinge, die geschützt gelassen worden Paket mit einem Großbuchstaben beginnen

  • Mitglied Variablen

    • Java Namenskonventionen alle Klassen nicht allzu gut riechen sollte - Diese sollten idealerweise privat sein
    • Die beiden Filter sind sehr ähnlich, aber teilen nicht gemeinsamen Code in einer abstrakten Elternklasse oder eine Nutzungsklasse
    • Datenbankverbindungen werden für jeden Login-Lookup erstellt - das ist in effizienter Weise - idealerweise Datenzugriff sollte über eine Datenzugriffsschicht sein und dies sollte einen Verbindungspool verwenden, so dass Verbindungen wieder verwendet und Sie schaffen nicht zu viele Verbindungen
    • Schluss Ressourcen - die Datenbankverbindung nicht richtig geschlossen wird, ist garantiert. Schauen Sie sich einen finally Block zum Schließen der Ressource
    • Ausnahmebehandlung mit - Ausnahmen sollten nicht verschluckt werden - sie in ServletException einpacken und werfen sie aus
    • Fangen NullPointerException s sollten diese nicht gefangen werden und sind in der Regel verursacht durch Schüler Bugs kodieren.
  • +0

    Ich weiß, aber ich habe es von meinem Kunden so gemacht. Hast du irgendwelche Vorschläge? – Dean

    +0

    Die FilterMappings für beide Filter beziehen sich auf den gleichen/add Ordner. Also werden beide Filter aufgerufen. Vielleicht möchten Sie nur, dass Ihre Admin-Inhalte den Admin-Filter durchlaufen. – pjp

    +0

    Vielen Dank das ist behoben. Und ich verstehe jetzt, was gut ist. – Dean