Java Jboss过滤器可以';t捕获所有客户端';s的HTTP请求
我对JBossServlet过滤器有一个大问题。我已经为特定的url模式创建了一个过滤器,但该过滤器不能捕获该模式的所有请求,只能捕获来自客户端的选项HTTP请求 我的筛选器在web.xml中声明如下:Java Jboss过滤器可以';t捕获所有客户端';s的HTTP请求,java,servlets,jboss,servlet-filters,Java,Servlets,Jboss,Servlet Filters,我对JBossServlet过滤器有一个大问题。我已经为特定的url模式创建了一个过滤器,但该过滤器不能捕获该模式的所有请求,只能捕获来自客户端的选项HTTP请求 我的筛选器在web.xml中声明如下: <filter> <filter-name>loginFilter</filter-name> <filter-class>myFilter</filter-class> </filter> <fil
<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>
逻辑过滤器
我的过滤器
逻辑过滤器
我的模式
对我来说,问题是为什么我不能捕获客户的所有请求
另外,我正在使用这个包com.sun.jersey.spi.container.ContainerResponseFilter,javax.ws.rs.container.ContainerResponseFilter中也提供了这个过滤器。
我不知道他们之间有什么区别 我认为这就是问题所在:- 首先,您需要使用RequestFilter,而不是ResponseFilter
com.sun.jersey.spi.container.ContainerResponseFilter
是jersey 1.x过滤器。
jersey的最新版本使用了javax.ws.rs.container.ContainerResponseFilter
看起来类路径中同时有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>
我的API
org.glassfish.jersey.servlet.ServletContainer
javax.ws.rs.container.ContainerRequestFilter
YourRequistFilter
javax.ws.rs.container.ContainerResponseFilter
您的响应过滤器
1.
但是请注意,当您的页面通过web.xml中的声明性安全性进行保护,并且页面上有一个过滤器时;你的过滤器将无法在你的页面上获取阻止的HTTP请求;因为请求首先到达您的容器,容器通过声明性安全性保护它,然后请求最终到达您的过滤器。简言之,容器优先于过滤器
在这种情况下,您可以将相关页面从声明性安全性中分离出来,并在过滤器中以编程方式处理安全性部分
例如,在上面的filter
方法中,您可以使用:-requestContext.getSecurityContext()
和获取提供安全访问的方法的访问权限。从编程安全性开始我尝试了ContainerRequestFilter、ContainerResponseFilter和java servlet filter,但仍然无法捕获从客户端到服务器的post请求。如果有问题,请求将被发送到受保护页面…您是否在请求筛选器中获得
ContainerRequestContext
的句柄?是的,筛选器无法捕获从客户端到jboss中受保护页面的HTTP Post请求…确定。看起来您已经在web.xml中为该页面启用了声明式安全性。您能将该页面从url模式中分离出来并检查您是否能够获取所有post请求吗?我已经尝试过,但该页面受到保护,当我将其移动到未受保护的页面时,从客户端捕获HTTP post请求没有问题。。。问题是:为什么我不能捕获对受保护页面的HTTP请求?