[英]Adding custom headers in Jersey Filters isn't working
一般來說,我是DropWizard框架和Jersey的新手。 因此,我在這里可能要完成的工作可能完全偏離了軌道。
我遇到了一個問題,我通過預匹配的請求過濾器添加到我的請求標頭中的參數沒有到達我的AuthCredentials對象的自定義提供程序。 我正在嘗試為每個需要從標頭參數進行身份驗證的資源提供AuthCredentials對象。 由於我要提供身份驗證標頭所依賴的一項服務尚未准備好,因此我自己通過在匹配前請求過濾器中添加它們來偽造它們。
這是我的代碼
@PreMatching
@Provider
class MyFilter implements ContainerRequestFilter{
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.getHeaders().add("param1", "value1");
}
}
class MyAuthCredentialsFactory implements Factory<AuthCredentials>{
@Inject
public MyAuthCredentialsFactory(HttpServletRequest request){
System.out.println("Param1 header value = " + request.getHeader("param1")); // <---This prints null
}
}
我在拖放向導框架的應用程序的run方法中注冊這些類,如下所示。
@Override
public void run(ServerConfigType configuration,
Environment environment) {
environment.jersey().register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(MyAuthCredentialsFactory.class).to(AuthCredentials.class).in(RequestScoped.class);
}
});
environment.jersey().register(MyFilter.class);
我的資源使用這樣的身份驗證憑據
@Path("/pathtomyresource")
public class MyApi {
@Inject AuthCredentials authCredentials;
}
我正在使用DropWizard 0.8.3和Jackson 2.5.3。
當我從標題打印param1的值時,我得到的是空值。 我在調試器中查看了HttpServletRequest的標頭名稱,但沒有在其中找到解釋為什么該值為null的param1。 我在互聯網上對此進行了大量研究,發現它應該可以工作但對我不起作用。 在這一點上,我感到困惑,非常感謝您的幫助。
HttpServletRequest
和ContainerRequestContext
不是同一件事,在后者中進行設置不會導致將其放入前者中。 您可以將ContainerRequestContext
注入到Factory
,然后從那里獲取屬性
@Inject
public MyAuthCredentialsFactory(ContainerRequestContext request){
}
個人什么,我只是做,當我需要訪問請求上下文,是不是實現Factory
,我只是延長AbstractContainerRequestValueFactory
所看到這里 。 然后,您可以調用getContainerRequest()
來獲取ContainerRequest
(實際上是相同的ContainerRequestContext
。
class MyAuthCredentialsFactory
extends AbstractContainerRequestValueFactory<AuthCredentials> {
@Override
public AuthCrendials provide() {
ContainerRequest request = getContainerRequest();
String header = request.getHeaderString(...);
}
}
另外,除了設置標題之外,您還可以使用setProperty(key, value)
在ContainerRequestContext
上設置任意屬性,然后在工廠中使用getProperty(key)
獲取它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.