1

次のような web.xml で定義されたフィルターがあります。

<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter>
    <display-name>AuthenticationFilter</display-name>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>com.filters.AuthenticationFilter</filter-class>
</filter>

そしてフィルターには次のコードがあります:-

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  // TODO Auto-generated method stub
  // place your code here

  HttpServletRequest httpRequest = (HttpServletRequest) request;
  HttpServletResponse hres = (HttpServletResponse) response;


  String pathInfo = httpRequest.getRequestURI().trim();

  System.out.println(pathInfo);

  // Do not process any non-jsp files or LogIn.jsp  ! pathInfo.endsWith("jsf") || 
  if (pathInfo.endsWith("RegistrationForm.jsf") || pathInfo.endsWith("Login.jsf")) {
   chain.doFilter(request, response);
   return;
  }
  // pass the request along the filter chain
  User user = (User) httpRequest.getSession().getAttribute("USER_IN_SESSION");
  if(user==null)
   hres.sendRedirect("Login.jsf");
  else {
   chain.doFilter(request, response);

  }

 }

問題は、Topic.jsp でアプリを呼び出すと、次のようにループすることです:-

Topic.jsp
LogIn.jsf
Login.jsp
Login.jsf
Login.jsp
...

問題はマッピングの FORWARD であることがわかりました。このエントリを削除すると、機能します

<dispatcher>FORWARD</dispatcher>

.jsp と .jsfを交互に繰り返すこの無限ループのパズルを解くのを手伝ってください:)

4

2 に答える 2

1

仮説:

  1. Topics.jsp は検証を必要とするため、LogIn.jsf へのリダイレクトが行われます。

  2. LogIn.jsf は FacesServlet によって提供されます。しかし、顔を含むページは実際には jsp ページです。したがって、サーブレットは LogIn.jsp (コンポーネント ツリーを構築するページ) に転送します。

  3. フィルターでは、パスは LogIn.jsp であり、LogIn.jsp の要求を検証しないため、認証を要求すると、LogIn.jsf へのリダイレクトが再度行われます。ステップ 2 に進みます。

したがって、 を削除すると、LogIn.jsf から LogIn.jsp への FacesServlet の転送がループに入りません。

簡単な解決策: if ステートメントのパス情報のリストに LogIn.jsp を追加します。

于 2011-02-05T09:24:54.633 に答える
1

まず第一に、(デフォルトの) global と all-covering の隣に // dispatchingsをフックしたいのはなぜですか?forwardincludeerrorrequest

<dispatcher>フィルター マッピングでこれらすべての行を削除します。認証フィルターにはそれらのいずれも必要ありません。カウントされるのは HTTP 要求だけです。内部転送/インクルード/エラー ディスパッチは、HTTP 要求が既に到着している (およびフィルター処理されている) 場合にのみ実行できます。

また、このリクエスト URI のチェックの代わりに、フィルターをより具体的なものなどにマップして<url-pattern>/secured/*ログインが必要なすべてのページをそこに配置し、登録およびログイン ページを外部に配置することもできます。

于 2011-02-07T11:36:14.543 に答える