在我的 spring boot 应用程序中,我有一个调度程序调用 API 来生成 token ,该 token 将在 15 分钟后过期。调度程序的时间也是 15 分钟。请找到以下示例:
public class TokenGeneration {
private static String token = null;
@Scheduled(15 minutes)
public String fetchToken() {
// api call which return token
HttpEntity<model> response = restTemplate.exchange(uri, POST, entity, model.class);
token = response.getBody().getAccessToken();
}
}
我通过非静态方法将 token 值存储在静态变量中,这样我就可以在任何我想使用 token 值的地方使用这个 token 变量。这是正确的方法吗?如果没有,请告诉我如何实现。
我是否需要将 TokenGeneration 类设为单例,以便在整个应用程序中只生成此类的一个实例?
我还想创建一个拦截器或过滤器,我可以在其中设置授权 header 和 token 值,以便每个请求都会自动填充授权 header ,我不想像这样在每个请求中设置授权 header :
HttpHeaders headers = new HttpHeaders();
headers.set(CpsConstant.AUTHORIZATION, CpsConstant.BEARER + token);
所以我尝试使用这个自定义拦截器:
public class RestTemplateInterceptor implements ClientHttpRequestInterceptor{
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
String token = TokenGeneration.token;
request.getHeaders().add("Authorization", "Bearer " + token);
return execution.execute(request, body);
}
将在配置文件的 restTemplate 中添加此拦截器。
那么对于 token 生成以及为每个请求设置 header 来说,这种方法是否正确,或者需要对这种方法进行任何改进? 我想在 token 为空的情况下在拦截器中调用 token 生成方法,例如:
if(token == null){
//call token generation fetchToken method
}
最佳答案
- 这是正确的方法
- 如果未指定,Spring 默认作用域始终为单例
- 使用拦截器是可以的,但是如果你想在没有 token 的情况下调用 API 怎么办?
使用两个单独的方法使用单独的类发送带 token 和不带 token 的请求的最佳方法
@Component
public class RestClient {
@Autowired
RestTemplate restTemplate;
public HttpHeaders getRequestHeaderBearer() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add(HeaderParameters.AUTHORIZATION, HeaderParameters.BEARER +
TokenGeneration.token);
return headers;
}
public HttpHeaders getRequestHeader() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
public <T> ResponseEntity<T> restExchangeBearer(String url, HttpMethod httpMethod,
Class<T> classObj) {
return restTemplate.exchange(url, httpMethod,
new HttpEntity<>("parameters", this.getRequestHeaderBearer()), classObj);
}
public <T> ResponseEntity<T> restExchange(String url, HttpMethod httpMethod,
Class<T> classObj) {
return restTemplate.exchange(url, httpMethod,
new HttpEntity<>("parameters", this.getRequestHeader()), classObj);
}
}
关于java - Spring 启动 : Token authentication(bearer) in request headers in rest api when token also comes from calling another api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52393514/