2012-04-19 21 views
3

ログインしていないユーザーが特定のページにアクセスするのを阻止するフィルタを作成しようとしていました。このため、次のようなフィルタクラスを作成しました。ログインページにログインしていないユーザーをリダイレクトするJavaフィルタ

私は今、非常に奇妙な愚かなことが起こっている()

のinitでArrayListのURLリストを作成するに

HttpServletRequest request = (HttpServletRequest) req; 
HttpServletResponse response = (HttpServletResponse) res; 
String url = request.getRequestURI(); 
boolean allowedRequest = false; 

System.out.println(url); 

if(urlList.contains(url)) { 
    allowedRequest = true; 
    System.out.println("in list"); 
} 

if (!allowedRequest) { 
    Object o = request.getSession().getAttribute("UserInfo"); 
    if (null == o) { 
     System.out.println("Hey i am in"); 
     response.sendRedirect("/login.jsp"); 
    } 
} 

chain.doFilter(req, res); 

} // end of doFilter 
はdoesnotユーザーが必要とするページが記録されるようにするには。 home.jspとdcr.jspという2つのページがあるとします。私がlogin.jspにうまくリダイレ​​クトされたときにhome.jspにアクセスしようとすると、dcr.jspにアクセスしようとしているときにリダイレクトされませんが、(null == o)私は取得していますので、console.THisに印刷されたその行は、私は、これは私がnull == oは本当だったことを私に伝えサーバー

/dcrmaintenance.jsp 

Hey i am in 

で取得出力され、サーバ で取得出力されます。

ページdcr.jspはセッションオブジェクトにアクセスするため、ユーザーはログインしていないため、期待通りにjava.lang.NullPointerExceptionが取得されていますが、ループに入った後でもリダイレクトが行われない理由を理解できません。私は間違いを犯しているところでそれを評価することができます。

答えて

9

return;を行います。

3

sendRedirectまたはdoFilterのいずれかを呼び出す必要があります。例えば。 response.sendRedirect("/login.jsp");

if (requiresLogin) 
    response.sendRedirect("/login.jsp"); 
else 
    chain.doFilter(req,resp); 
0
chain.doFilter(req, res); 

他のどのフィルタがアプリケーションで実行されていますか?リダイレクトを送信しますが、フィルタチェーンを続行します。私は別のフィルタが再び応答を変更していると思います。フィルタを使用している場合は、リダイレクト直後に戻ってください。

Java Webアプリケーションでは、フィルタの代わりにweb.xmlにセキュリティ制約を定義できます。 セキュリティの制約をご覧ください。

ショート例:

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>Restricted Area</web-resource-name> 
    <url-pattern>*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
    <role-name>Authorized</role-name> 
    </auth-constraint> 
</security-constraint> 
+0

私はセキュリティ上の制約を使用する方法をチェックアウトしますworked.But他filter.The他のソリューションを持っていませんでし!ありがとう。 – Shamik

0

私はあなたが適切なフォルダに制限されたリソースを配置する必要があり ...あなたのweb.xmlを変更することがあると思います。このようにして、Filter Servletは、「制限された」フォルダに割り当てられたファイルを制限します(http://www.developer.com/security/article.php/3467801/Securing-J2EE-Applications-with-a-Servlet-Filter.htm)(そして、私はFilter Servletを使用する理由は独自の認証システムを作成していると思います。 .xmlファイルは、[データベースでそれを定義する必要があります;))))

<!--Servlet Filter that handles site authorization.--> 
<filter> 
    <filter-name>AuthorizationFilter</filter-name> 
    <filter-class>examples.AuthorizationFilter</filter-class> 
    <description>This Filter authorizes user access to application 
        components based upon request URI.</description> 
    <init-param> 
     <param-name>error_page</param-name> 
     <param-value>../../login.html</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>AuthorizationFilter</filter-name> 
    <url-pattern>/restricted/*</url-pattern> 
</filter-mapping> 
関連する問題