Java Jboss过滤器可以';t捕获所有客户端';s的HTTP请求

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

我对JBossServlet过滤器有一个大问题。我已经为特定的url模式创建了一个过滤器,但该过滤器不能捕获该模式的所有请求,只能捕获来自客户端的选项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>

逻辑过滤器
我的过滤器
逻辑过滤器
我的模式
对我来说,问题是为什么我不能捕获客户的所有请求

另外,我正在使用这个包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请求?