5

ログインしていないユーザーが特定のページにアクセスできないようにするフィルターを作成しようとしていました。このために、次のdoFilterメソッドでフィルター クラスを作成しました。

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

ユーザーがログインする必要のないページを許可するために、init() で arraylist url-list を作成しました。

今、非常に奇妙な愚かなことが起こっています。home.jsp と dcr.jsp の 2 つのページがあるとします。ログインせずにhome.jspにアクセスしようとすると、login.jspに正常にリダイレクトされますが、dcr.jspにアクセスしようとすると、ループif(null == o)に入りますがリダイレクトされません。コンソールに出力された行を取得しているためです。これは、サーバーで取得した出力です。これは、サーバーで取得した出力です。

/dcrmaintenance.jsp

Hey i am in

これは、 null == o が真であったことを示しています。

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

4

4 に答える 4

11

response.sendRedirect("/login.jsp");てからreturn;

于 2012-04-19T09:41:47.713 に答える
3

sendRedirect または doFilter を呼び出す必要があると思います。例えば

if (requiresLogin)
  response.sendRedirect("/login.jsp");
else
  chain.doFilter(req,resp);
于 2012-04-19T09:41:39.277 に答える
0

web.xml を変更する必要があると思います... 制限されたリソースを適切なフォルダーに配置する必要があります。このようにして、フィルターサーブレットは「制限された」フォルダーに割り当てられるファイルを制限します ) (フィルター サーブレットを使用する理由は、独自の認証システムを作成するためだと思います。- この方法では、セキュリティ制約を web.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>
于 2015-07-26T21:00:21.183 に答える
0
chain.doFilter(req, res);

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

フィルターの代わりに、Java WebApp では web.xml でセキュリティ制約を定義できます。Security Constraintsをご覧ください。

短い例:

<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>
于 2012-04-19T09:48:45.613 に答える