Spring Boot 是一个用于简化 Spring 应用程序初始搭建以及开发过程的框架。它通过自动配置和约定大于配置的原则,极大地简化了 Spring 应用的开发和部署。
令牌(Token)通常用于身份验证和授权。在微服务架构中,一个服务可能需要调用另一个服务,此时需要确保调用者有权访问被调用的服务。令牌就是一种证明调用者身份的方式。
常见的令牌类型包括:
在微服务架构中,服务间调用通常需要身份验证。例如,一个用户管理服务可能需要调用一个用户资料服务来获取用户的详细信息。此时,用户管理服务需要携带一个有效的令牌来证明其有权访问用户资料服务。
假设我们有两个服务:user-service
和 profile-service
。user-service
需要调用 profile-service
来获取用户的详细信息。
首先,user-service
需要从认证服务器获取一个访问令牌。这通常通过 OAuth2 或 JWT 实现。
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
public class TokenClient {
private static final String AUTH_SERVER_URL = "http://auth-server/oauth/token";
private static final String CLIENT_ID = "your-client-id";
private static final String CLIENT_SECRET = "your-client-secret";
public String getAccessToken() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "client_credentials");
params.add("client_id", CLIENT_ID);
params.add("client_secret", CLIENT_SECRET);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Map> response = restTemplate.postForEntity(AUTH_SERVER_URL, request, Map.class);
return (String) response.getBody().get("access_token");
}
}
获取到访问令牌后,user-service
可以使用该令牌来调用 profile-service
。
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
public class ProfileClient {
private static final String PROFILE_SERVICE_URL = "http://profile-service/user/profile";
private String accessToken;
public ProfileClient(String accessToken) {
this.accessToken = accessToken;
}
public String getUserProfile() {
HttpHeaders headers = new HttpHeaders();
headers.setBearerAuth(accessToken);
HttpEntity<String> request = new HttpEntity<>(headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(PROFILE_SERVICE_URL, HttpMethod.GET, request, String.class);
return response.getBody();
}
}
原因:访问令牌通常有一个有效期,过期后需要重新获取。
解决方法:使用刷新令牌来获取新的访问令牌。
public String refreshAccessToken() {
// 类似 getAccessToken 方法,但 grant_type 改为 "refresh_token",并携带 refresh_token 参数
}
原因:可能是令牌被篡改、过期或无效。
解决方法:检查令牌的生成和验证逻辑,确保使用安全的加密算法和正确的密钥。
原因:浏览器出于安全考虑,限制了跨域请求。
解决方法:在 profile-service
中配置 CORS(跨域资源共享),允许来自 user-service
的请求。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://user-service")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
};
}
}
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云