2009-08-10 14 views
0

通常のユーザには1、管理者には2のフィルタを作成しましたが、ログインするには管理者でなければなりません。ここに私のフィルターの両方のソースは次のとおりです。フィルタヘルプ - お互いに作用する2つのフィルタを取得する

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

他のフィルタ:ここ

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

} 

は、私のWeb xmlファイルは次のとおりです。事前に

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

おかげ ディーン

+0

ご質問はありますか? – dfa

+2

"ここに私のコードがあります、ミニオン" – skaffman

+0

まあ、なぜ私はそれが動作するときに私はまだ管理者アカウント以外のアカウントでログインしてもうまくいかないのです。 – Dean

答えて

0

あなたは本当にあなた自身のアクセスセキュリティをすべて実装したいと思っていますか?サーブレットの仕様は保護されたリソースをサポートしており、基本的には自分がやっていることを行うことができます。ユーザーオブジェクトをセッションにポップするフィルタを作成することもできます。

コンテナ認証を使用してWebリソースへのアクセスを保護するには、このリンクhttp://www.informit.com/articles/article.aspx?p=24253をご覧ください。 -

はまた、あなたのコードですべてのクラスが大文字で始まる必要がありますJavaの命名規則が

  • メンバー変数が保護されたパッケージが残されている
    • あまりにも良い匂いを嗅ぐないものがいくつかありますかすめますこれは効率的である - - これらは、理想的には、データベース接続が各ログインのルックアップのために作成されている
    • 抽象親クラスやユーティリティクラスに共通のコードを共有していない2つのフィルタは、まだ非常によく似ています
    • privateである必要があります理想的にはデータアクセスはデータアクセス層を経由しなければなりません。接続プールを使用して接続を再利用し、あまりにも多くの接続を作成しないようにしてください。
    • リソースをクローズする - データベース接続が正しく閉じられないことがあります。 NullPointerException秒これらはキャッチすべきではないと一般的に生徒によって引き起こされるのキャッチ
    • ServletExceptionでそれらをラップし、それらを捨てる - 例外が飲み込まれるべきではない - リソース
    • 例外処理を閉じるためfinallyブロックを使用してを見てくださいバグをコード化する。
  • +0

    私はまだクライアントにこのように言われていることを知っています。だから提案はありますか? – Dean

    +0

    両方のフィルタのFilterMappingsは、同じ/ addフォルダを参照します。したがって、両方のフィルターが呼び出されます。たぶんあなたの管理者が管理者のフィルタを通過するだけでいいのかもしれません。 – pjp

    +0

    ありがとうございました。そして、私は今それをよく理解しています。 – Dean

    関連する問題