创建一个out拦截器并将其注册到ws-client是可行的((参考)
public class OAuth2OutInterceptor extends
AbstractPhaseInterceptor<Message> {
private String token;
public OAuth2OutInterceptor(String token) {
super(Phase.WRITE);
this.token = token;
}
public void handleMessage(Message message) throws Fault {
Map<String, List<String>> headers = CastUtils.cast((Map<?,
?>)message.get(Message.PROTOCOL_HEADERS));
headers.put("Authorization",
Collections.singletonList("Bearer " + token));
}
}
输出拦截器注册到实际服务(authenticatorwebservice),如下所示。
ClientProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(AuthenticatorWebService.class);
factory.setAddress(urlPath);
AuthenticatorWebService authenticator = (AuthenticatorWebService) factory.create();
Client proxy = ClientProxy.getClient(authenticator);
OAuth2OutInterceptor interceptor = new OAuth2OutInterceptor(token);
proxy.getOutInterceptors().add(interceptor);
Object[] authenticates = proxy.invoke("authenticate", username, password);
Optional<Object> objs = Arrays.stream(authenticates).findFirst();
if (objs.isPresent()) {
output = objs.get().toString();
}
此实现有两个潜在的缺点:
proxy.invoke将实际方法用作字符串。最好使用静态绑定而不是动态绑定。
proxy.invoke返回一个对象数组。最好是直接获取实际响应,而不是像上面提到的那样解析对象数组。
想知道是否有另一种方法可以以更优雅的方式在http头中传递承载令牌。
暂无答案!
目前还没有任何答案,快来回答吧!