我覺得這是什麼問題: -
所有你需要使用一個RequestFilter而不是ResponseFilter第一。
com.sun.jersey.spi.container.ContainerResponseFilter
是球衣1.x過濾器。 API link here.
球衣的最新版本使用javax.ws.rs.container.ContainerResponseFilter
。 API 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.
我試過使用ContainerRequestFilter,ContainerResponseFilter和java servlet過濾器,但仍無法從客戶端向服務器發送請求。這些請求發送到受保護的頁面,如果這很重要... – Balflear 2014-09-17 07:11:58
你的請求過濾器中是否有'ContainerRequestContext'的句柄? – Abhin 2014-09-17 10:56:50
是的,過濾器無法將我的HTTP POST請求從客戶端捕獲到我的jboss中的受保護頁面... – Balflear 2014-09-18 08:38:04