gpt4 book ai didi

java - Spring 4中如何处理多个ClientHttpRequestInterceptor

转载 作者:行者123 更新时间:2023-12-02 01:55:28 24 4
gpt4 key购买 nike

在 RestTemplate 中,我配置了两个 ClientHttpRequestInterceptor(一个用于 BasicAuthorization,另一个用于基于 Token 的身份验证。

从客户端,我如何要求 RestTemplate 使用正确的 ClientHttpRequestInterceptor 来执行 API 调用。

某些 API 调用需要 BasicAuthorization 才能工作。 (例如:如果 URL 以“/admin”开头,则需要 BasicAuthorization,其他则需要基于 token 的身份验证)

如何在 Spring 4 中实现这一目标?

最佳答案

您可以使用两个 RestTemplate 实例,一个用于基本身份验证,一个用于 token 身份验证。

@Bean
@Qualifier("authRestTemplate")
public RestTemplate getAuthTemplate{
// create rest template, add auth interceptor
}

@Bean
@Qualifier("tokenRestTemplate")
public RestTemplate getTokenTemplate{
// create rest template, add token interceptor
}

然后,在 Autowiring RestTemplate 时,使用所需的 @Qualifier

@Autowired
@Qualifier("authRestTemplate")
private RestTemplate authTemplate;

@Autowired
@Qualifier("tokenRestTemplate")
private RestTemplate tokenTemplate;

另一种选择是将两个 ClientHttpRequestInterceptor 添加到 RestTemplate

class BasicAuthInterceptor implements ClientHttpRequestInterceptor {

private final AuthService authService;

public BasicAuthHeaderInterceptor(AuthService authService) {
this.authService = authService;
}

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
if(isApplicable(request)){
String token = Base64Utils.encodeToString((authService.getUsername() + ":" + authService.getpassword()).getBytes(Charset.forName("UTF-8")));
request.getHeaders().add("Authorization", "Basic " + token);
}
return execution.execute(request, body);
}

}

class TokenInterceptor implements ClientHttpRequestInterceptor {

private final AuthService authService;

public TokenHeaderInterceptor(AuthService authService) {
this.authService = authService;
}

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
if(isApplicable(request)){
request.getHeaders().add("Authorization", "Bearer " + tokenService.getToken());
}
return execution.execute(request, body);
}

}

然后,将两个拦截器添加到RestTemplate

@Bean
public RestTemplate restTemplate(){
RestTemplate template = new RestTemplate();

template.getInterceptors().add(new BasicAuthInterceptor(authService));
template.getInterceptors().add(new TokenInterceptor(authService));

return template;
}

关于java - Spring 4中如何处理多个ClientHttpRequestInterceptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52378547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com