web-dev-qa-db-ja.com

web.xml url-patternマッチャーで、URLを除外する方法はありますか?

CSS、JS、およびIMAGEファイルを除いて、サイトのURLにアクセスするたびに呼び出す必要があるフィルターを作成しました。だから私の定義では次のようなものが欲しいです:

<filter-mapping>
   <filter-name>myAuthorizationFilter</filter-name>
   <url-pattern>NOT /css && NOT /js && NOT /images</url-pattern>
</filter-mapping>

とにかくこれを行うにはありますか?私が見つけることができる唯一のドキュメントは/ *しかありません

更新:

私は、J4mes氏の回答に似たものを使用してしまいました。

   private static Pattern excludeUrls = Pattern.compile("^.*/(css|js|images)/.*$", Pattern.CASE_INSENSITIVE);
   private boolean isWorthyRequest(HttpServletRequest request) {
       String url = request.getRequestURI().toString();
       Matcher m = excludeUrls.matcher(url);

       return (!m.matches());
   }
22
kasdega

私はあなたがこれを試すことができると思います:

@WebFilter(filterName = "myFilter", urlPatterns = {"*.xhtml"})
public class MyFilter implements Filter {

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
      String path = ((HttpServletRequest) request).getServletPath();

      if (excludeFromFilter(path)) chain.doFilter(request, response);
      else // do something
   }

   private boolean excludeFromFilter(String path) {
      if (path.startsWith("/javax.faces.resource")) return true; // add more page to exclude here
      else return false;
   }
}
21
Mr.J4mes

URLパターンマッピングは除外をサポートしていません。これはサーブレット仕様の制限です。 Mr.J4mesによって投稿された手動の回避策を試すことができます。

5
Perception

おそらく、cssjsなどに対して別の「空白」フィルターを宣言し、他のフィルターマッピングの前に置くことができます。

1
IProblemFactory

アクセス制御にセキュリティ制約を使用しました。コードを参照してください:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Unsecured resources</web-resource-name>
        <url-pattern>/resources/*</url-pattern>
        <url-pattern>/javax.faces.resource/*</url-pattern>
    </web-resource-collection>
</security-constraint>

私は this チュートリアルに従います。

0
Wendel