【问题标题】:Jboss filter can't catch all client's HTTP requestsJboss过滤器无法捕获所有客户端的HTTP请求
【发布时间】:2014-11-05 06:10:42
【问题描述】:

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

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

附言。我正在使用这个包 com.sun.jersey.spi.container.ContainerResponseFilter,过滤器在 javax.ws.rs.container.ContainerResponseFilter 中也可用。 不知道他们有什么区别……

【问题讨论】:

    标签: java servlets jboss servlet-filters


    【解决方案1】:

    我认为这就是问题所在:-

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

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

    最新版球衣使用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 方法中,您可以使用 :-
    requestContext.getSecurityContext() 获取对 SecurityContext 的保留,并访问提供安全访问权限的方法。
    程序化安全的开始here.

    【讨论】:

    • 我已经尝试过使用 ContainerRequestFilter、ContainerResponseFilter 和 java servlet 过滤器,但仍然无法捕获从客户端到服务器的发布请求。如果这很重要,请求将发送到受保护的页面......
    • 您的请求过滤器中是否有ContainerRequestContext 的句柄?
    • 是的,过滤器无法捕获我的 HTTP Post 请求从客户端到我的 jboss 中的受保护页面...
    • 好的。看起来您已在 web.xml 中为该页面启用声明性安全性。您能否将该页面与您的 url 模式分开并检查您是否能够获取所有发布请求?
    • 我试过了,但是页面是受保护的,当我将它移动到不受保护的页面时,捕获来自客户端的 HTTP 发布请求没有问题......问题是:为什么我可以' t 捕获对受保护页面的 HTTP 请求?
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2023-01-13
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多