我对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.ContainerResponseFilter
。 API 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/