在 web.xml url-pattern 匹配器中是不是有排除 URL 的方法?

Posted

技术标签:

【中文标题】在 web.xml url-pattern 匹配器中是不是有排除 URL 的方法?【英文标题】:In a web.xml url-pattern matcher is there a way to exclude URLs?在 web.xml url-pattern 匹配器中是否有排除 URL 的方法? 【发布时间】:2012-01-29 08:17:28 【问题描述】:

我编写了一个过滤器,每次访问我网站上的 URL 时都需要调用它,除了 CSS、JS 和 IMAGE 文件。所以在我的定义中,我想有类似的东西:

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

有没有办法做到这一点?我能找到的唯一文档只有 /*

更新:

我最终使用了类似于 Mr.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());
   

【问题讨论】:

Can I exclude some concrete urls from <url-pattern> inside <filter-mapping>?的可能重复 【参考方案1】:

我觉得你可以试试这个:

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

【讨论】:

@WebFilter 来自哪里?我目前正在使用 spring-mvc,我正在使用 @Service(value="myAuthorizationFilter") 定义我的过滤器 我认为这是一个普通的JavaEE注解。查看here 我最终做了一些与此非常相似的事情,但我将正则表达式与 Pattern 和 Matcher 一起使用。像这样:private static Pattern excludeUrls = Pattern.compile("^.*/(css|js|images|ckeditor)/.*$", Pattern.CASE_INSENSITIVE); :P 然后你应该用你是如何成功的更新你的问题,你也可以把这个标记为答案=P。【参考方案2】:

网址模式映射不支持排除项。这是 Servlet 规范的限制。您可以尝试 Mr.J4mes 发布的手动解决方法。

【讨论】:

【参考方案3】:

也许您可以为cssjs 等声明另一个“空白”过滤器,并将其放在其他过滤器映射之前。

【讨论】:

【参考方案4】:

我使用安全约束来进行访问控制。见代码:

<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 教程。

【讨论】:

以上是关于在 web.xml url-pattern 匹配器中是不是有排除 URL 的方法?的主要内容,如果未能解决你的问题,请参考以下文章

web.xml

web.xml中url-pattern中/和/*的区别(来自网络)

Web.xml中设置Servlet和Filter时的url-pattern匹配规则

web.xml中 /和/*的区别

web.xml中的url-pattern映射规则

web.xml中的url-pattern映射规则