我对jboss servlet过滤器有很大的疑问。我已经为特定的url模式创建了一个过滤器,但是该过滤器无法捕获对模式的所有请求,只能捕获来自客户端的OPTIONS HTTP请求。

我的过滤器在web.xml中这样声明:

<filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>myFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>myPattern</url-pattern>
</filter-mapping>


我的问题是为什么我无法捕获来自客户端的所有请求...

PS。我正在使用com.sun.jersey.spi.container.ContainerResponseFilter这个包,javax.ws.rs.container.ContainerResponseFilter中也提供了过滤器。
我不知道它们之间有什么区别...

最佳答案

我认为这是问题所在:

首先,您需要使用RequestFilter而不是ResponseFilter。

com.sun.jersey.spi.container.ContainerResponseFilter是球衣1.x过滤器。
API link here.

最新版本的jersey使用javax.ws.rs.container.ContainerResponseFilterAPI link here

看起来您的类路径中同时包含jersey 1.x和2.x jar。您需要使用所需的一个,然后删除另一个。

假设您使用的是最新的2.x jar
您需要实现自己的RequestFilter,它看起来像:-

    @Provider
    public class YourReqeustFilter implements ContainerRequestFilter {
         @Override
        public void filter(ContainerRequestContext requestContext)
                        throws IOException {
             // Use ContainerRequestContext  to intercept the http request.
           }
        }
    }


然后,用于servlet的web.xml应如下所示:-

<servlet>
        <servlet-name>MY API</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.container.ContainerRequestFilter</param-name>
            <param-value>yourReqeustFilter</param-value>
        </init-param>
        <init-param>
            <param-name>javax.ws.rs.container.ContainerResponseFilterr</param-name>
            <param-value>yourResponseFilter</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
 </servlet>


但是请注意,当您的网页在web.xml中受到声明式安全性的保护时,上面会有一个过滤器;您的过滤器将无法保留网页上被阻止的HTTP请求;由于请求首先到达您的容器,而容器由于声明性的安全性而对其进行了保护,然后请求最终到达了过滤器。简而言之,容器优先于您的过滤器。

在这种情况下,尽管您可以将相关页面从声明性安全性中分离出来,并在过滤器中以编程方式处理安全性部分。

例如,在上述filter方法中,您可以使用:-来保留SecurityContext
requestContext.getSecurityContext(),然后访问提供安全性访问的方法。
程序安全性here.的开始

关于java - Jboss过滤器无法捕获所有客户端的HTTP请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25784987/

10-10 13:57
查看更多