- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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/
我的 Spring Boot 应用程序中有下面列出的loggingInterceptor。每当调用 REST 服务时都会调用此拦截器。我看到前 2 个 sysout 语句立即打印,第三个 sysout
我已经为我的自定义日志拦截器完成了以下操作 public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {
我想使用拦截器将授权 header 添加到通过休息模板发出的每个请求中。我这样做是这样的: public FirebaseCloudMessagingRestTemplate(@Autowired R
我将多个 ClientHttpRequestInterceptor 设置为 RestTemplate (CommonRestTemplateBuilder) 的常用配置,其中之一是 LogReques
我正在将消息级加密 (MLE) 添加到用于传出请求的现有代码库中。为此,我简单地编写了一个拦截器,它将捕获传出的请求,加密它们的主体,然后将请求发送出去。我们得到的响应也是加密的,必须解密。这一切对我
假设我有以下 2 ClientHttpRequestInterceptor s: public class RequestLoggerInterceptor implements ClientHttp
我正在使用 ClientHttpRequestInterceptor 报告 RestTemplate 的请求输出和响应输入。如果出现异常,我需要记录响应,假设模板是否试图用错误的类取消响应。 这是拦截
下面的单元测试失败。我正在打印请求和响应,并且可以确认 MockRestServiceServer 在调用端点时返回模拟的 JSON。当我将测试更改为直接与服务器通信时,单元测试通过。不知道我做错了什
所以我有以下场景要使用 Spring boot rest template 来实现消耗 REST-API (涉及token认证机制)。为了执行测试,我在 Spring Boot 中创建了简单的模拟 R
我需要在所有 RestTemplate 客户端请求中添加一个自定义 header 。所以我实现了 ClientHttpRequestInterceptor。然后我在我的 RestTemplateBui
我使用 @Autowired 访问 Spring MVC Controller 中的 session ,如下所示: @Autowired private HttpSession session; 问题
我正在尝试使用休息服务并且我正在发布一些数据,使用 Spring RestTemplate postForObjectMethod 但是我得到了一个空响应,即使我可以在有效负载中看到请求和响应。 [更
我是一名优秀的程序员,十分优秀!