2017-08-21 28 views
0

我需要将授权头添加到来自客户端的所有传出请求中,并且我按照this的说明添加了ClientRequestFilter答案。从JAX RS客户端删除过滤器

现在我想改变我创建的过滤器的属性。我试图重新注册过滤器的新副本,但没有奏效。我试图查看Client对象的可用方法,但没有发现类似注销或删除的任何内容。

示例代码:

Client client = ClientBuilder.newClient().register(new ClientObjectMapperProvider()); 
AuthTokenFilter authTokenFilter = new AuthTokenFilter(authTokenService, authConfig); 
     client.register(authTokenFilter); 
//make some requests 


//In another method in another class 
AuthTokenFilter newFilter = new AuthTokenFilter(authTokenService, newConfig); 
client.register(newFilter); 

//make more requests 

当我送注册新的过滤器后的要求,我想在auth头根据新的配置有所不同,但是这不会发生。

在进一步调查中,如果另一个相同类型已经注册,客户端对象似乎不会注册一个对象。尽管如此,仍然没有找到解除注册的方法。

+0

*我试图重新注册过滤器的新副本,但是没有工作*代码在哪里? – nullpointer

+0

@nullpointer我无法分享整个事情,因为它分布在多个文件中,并且有很多,但我已经编辑过包含基本想法。 – hoodakaushal

回答

1

创建客户端实例相当重量级,因此您不希望经常这样做,因此有意义的是您正在缓存和重新使用客户端实例。

如果您只是希望为每个目标端点设置一个单独的认证过滤器,则不必在客户端实例上进行注册。在你实际谈论任何事情之前,你需要创建一个WebTarget(它代表你要与之通信的具体端点)一旦你创建了WebTarget,你就可以用这个注册你的过滤器。

配置网页目标也可能相当重(see here) ,但它的确意味着您可以为每个目标主机生成(并缓存)不同的身份验证过滤器。

如果您想要根据某些已编辑的配置(例如属性文件/配置REST端点)动态重新配置客户端/ webtarget,那么您可以简单地拥有WebTarget/Client实例的缓存,变化。 (在丢弃任何旧客户端实例之前,您需要记得致电client.close()

+0

这也是我的第一个想法,但由于我在各种方法中调用了很多不同的端点,我不想改变它们 - 这会破坏使用过滤器的整个观点 - 以避免复制粘贴相同的代码遍布整个地方。 – hoodakaushal