2011-04-04 87 views

回答

6

您可能希望设置servlet过滤器映射,以便在完全请求特定的servlet时不会触发它。

示例配置可能看起来像这样,假设有一个DefaultServlet不应受过滤器和其他两个受影响的servlet FirstServlet和SecondServlet的影响。

<filter-mapping> 
    <filter-name>MyFilter</filter-name> 
    <servlet-name>FirstServlet</servlet-name> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>MyFilter</filter-name> 
    <servlet-name>SecondServlet</servlet-name> 
</filter-mapping> 
+0

不幸的是,我想忽略的servlet是默认的servlet,它处理所有未在别处处理的URL。这意味着它会有一个非常复杂的URL模式。 – tomdee 2011-04-04 10:03:39

+0

您可以将过滤器不仅映射到URL模式,而且还映射到特定的servlet。这意味着您可以仅为您希望应用过滤器的servlet定义映射。 – 2011-04-04 10:06:19

0

可以分配这些要被过滤 例如网址模式

<filter> 
     <filter-name>Admin</filter-name> 
     <filter-class>com.nil.FilterDemo.AdminFilter</filter-class> 
</filter> 

<filter-mapping> 
     <filter-name>Admin</filter-name> 
     <url-pattern>/admin/*</url-pattern> 
</filter-mapping> 

此过滤器将针对servlet引擎使用/ admin映射处理的每个请求运行。

+0

他想做相反的事。 – BalusC 2011-04-04 13:31:24

0

我一直认为你应该能够在web.xml中例如url-patterns。如果你可以这样做:

<filter-mapping> 
    <filter-name>MyFilter</filter-name> 
    <url-pattern> 
     <match>/resources/*</match> 
     <except>/resouces/images/blah.jpg</except> 
    </url-pattern> 

但你不能这样对你没有帮助!

你显然必须通过请求对象访问URL的过滤器,所以你可以做这样的事情:

public void doFilter(ServletRequest sRequest, ServletResponse sResponse, 
         FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest)sRequest; 

    if(!request.getRequestURI.equals("/resources/images/blah.jpg")) { 
     doLogging(); 
    } 

    chain.doFilter(); 
} 

(这里硬编码的,但你很可能从属性文件中读取)尽管这可能对您没有用处,因为您在查询中提到了servlet,而不是URL模式。

编辑:另一种想法。如果你不介意做你的记录在servlet完成后,你可以做这样的事情:

public void doFilter(ServletRequest sRequest, ServletResponse sResponse, 
         FilterChain chain) throws IOException, ServletException { 

    sRequest.setAttribute("DO_LOGGING", new Boolean(true)); 
    chain.doFilter(); 

    Boolean doLogging = (Boolean)sRequest.getAttribute("DO_LOGGING"); 
    if(doLogging) { 
     doLogging(); 
    } 
} 

,并要伐木排除可以只该属性设置为false,你的servlet。

public void doGet(HttpServletRequest req, 
        HttpServletResponse res) throws IOException { 

    req.setAttribute("DO_LOGGING", new Boolean(false)); 
    // other stuff 
}