2014-09-11 129 views
0

我有一個jboss servlet過濾器的大問題。我爲特定的url-pattern創建了一個過濾器,但過濾器無法捕獲所有對該模式的請求,只能捕獲來自客戶端的OPTIONS HTTP請求。Jboss過濾器無法捕獲所有客戶端的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中可用。 我不知道它們之間有什麼區別...

回答

0

我覺得這是什麼問題: -

所有你需要使用一個RequestFilter而不是ResponseFilter第一。

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

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

看起來你的classpath中既有球衣1.x又有2.x罐子。你需要使用你需要的一個,並刪除另一個。

假設你正在使用 你需要實現自己的RequestFilter將看最新的2.x的罐子,如: -

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

然後你的web.xml的Servlet應該是這樣的: -

<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.

+0

我試過使用ContainerRequestFilter,ContainerResponseFilter和java servlet過濾器,但仍無法從客戶端向服務器發送請求。這些請求發送到受保護的頁面,如果這很重要... – Balflear 2014-09-17 07:11:58

+0

你的請求過濾器中是否有'ContainerRequestContext'的句柄? – Abhin 2014-09-17 10:56:50

+0

是的,過濾器無法將我的HTTP POST請求從客戶端捕獲到我的jboss中的受保護頁面... – Balflear 2014-09-18 08:38:04