我可以从<filter-mapping>中的<url-pattern>中排除一些具体的URL吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (49)

我想要一些具体的过滤器应用于所有的URL,除了一个具体的(/*除了/specialpath)之外。

有没有可能做到这一点?

示例代码:

<filter>
    <filter-name>SomeFilter</filter-name>
    <filter-class>org.somproject.AFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SomeFilter</filter-name>
    <url-pattern>/*</url-pattern>   <!-- the question is: how to modify this line?  -->
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
提问于
用户回答回答于

标准的Servlet API不支持这种功能。你可能希望为Tuckey的一个(与Apache HTTPD类似的mod_rewrite)使用rewrite-URL过滤器,或者在doFilter()侦听的Filter 的方法中添加一个检查/*

String path = ((HttpServletRequest) request).getRequestURI();
if (path.startsWith("/specialpath/")) {
    chain.doFilter(request, response); // Just continue chain.
} else {
    // Do your business stuff here for all paths other than /specialpath.
}

如有必要,你可以指定要忽略的路径作为init-param过滤器的一部分,以便web.xml无论如何都可以控制它。你可以按如下方式在过滤器中获取它:

private String pathToBeIgnored;

public void init(FilterConfig config) {
    pathToBeIgnored = config.getInitParameter("pathToBeIgnored");
}

如果过滤器是第三方API的一部分,因此您无法对其进行修改,请将其映射到更具体的位置url-pattern,例如/otherfilterpath/*创建一个新的过滤器/*,并将其转发到匹配第三方过滤器的路径。

String path = ((HttpServletRequest) request).getRequestURI();
if (path.startsWith("/specialpath/")) {
    chain.doFilter(request, response); // Just continue chain.
} else {
    request.getRequestDispatcher("/otherfilterpath" + path).forward(request, response);
}

为了避免这个过滤器会在无限循环中调用它自己,你只需要让它只监听(派发)REQUEST并且仅使用第三方过滤器FORWARD

用户回答回答于

我使用了Eric Daugherty描述的方法:我创建了一个特殊的servlet,它始终以403代码回答,并将其映射放在通用代码之前。

映射片段:

  <servlet>
    <servlet-name>generalServlet</servlet-name>
    <servlet-class>project.servlet.GeneralServlet</servlet-class>
  </servlet>
 <servlet>
    <servlet-name>specialServlet</servlet-name>
    <servlet-class>project.servlet.SpecialServlet</servlet-class>
 </servlet>
 <servlet-mapping>
    <servlet-name>specialServlet</servlet-name>
    <url-pattern>/resources/restricted/*</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
    <servlet-name>generalServlet</servlet-name>
    <url-pattern>/resources/*</url-pattern>
 </servlet-mapping>

和servlet类:

public class SpecialServlet extends HttpServlet {
    public SpecialServlet() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendError(HttpServletResponse.SC_FORBIDDEN);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendError(HttpServletResponse.SC_FORBIDDEN);
    }
}

扫码关注云+社区