在Jersey Filters中添加自定义标头不起作用

时间:2015-10-04 18:56:52

标签: java filter jersey request dropwizard

我是DropWizard框架和Jersey的新手。所以我可以完全脱离我想要在这里完成的事情。

我遇到的问题是,我通过预匹配的请求过滤器添加到请求标头的参数未到达我的AuthCredentials对象的自定义提供程序。我试图为每个需要从头参数auth的资源提供一个AuthCredentials对象。由于我将依赖提供auth标头的服务之一还没有准备就绪,我将它们伪装成预先匹配的请求过滤器中的它们。

这是我的代码

 @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
     }
}

我在drop wizard框架中的应用程序运行方法中注册这些类,如下所示。

@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的值时,我得到一个null。我查看了调试器中的HttpServletRequest的头名,并没有在那里找到param1,这解释了为什么值为null。我在互联网上做了很多研究,发现它应该可以工作但不适合我。在这一点上,我很困惑,我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

HttpServletRequestContainerRequestContext不是一回事,在后者中设置某些东西不会导致它被放在前者中。您可以将ContainerRequestContext注入Factory,然后从那里获取属性

 @Inject
 public MyAuthCredentialsFactory(ContainerRequestContext request){
 }

我个人所做的,当我需要访问请求上下文时,不是实现Factory,而是像AbstractContainerRequestValueFactory那样扩展here。然后,您只需拨打getContainerRequest()即可获取ContainerRequest(实际上是ContainerRequestContext

class MyAuthCredentialsFactory 
        extends AbstractContainerRequestValueFactory<AuthCredentials> {
    @Override
    public AuthCrendials provide() {
        ContainerRequest request = getContainerRequest();
        String header = request.getHeaderString(...);
    }
}

或者,您可以使用ContainerRequestContextsetProperty(key, value)上设置任意属性,而不是设置标题,然后在工厂中使用getProperty(key)

进行设置