依赖管理#
父 pom.xml 固定三版本管控#
版本参考
<dependencyManagement>
<dependencies>
<!-- 1. SpringBoot 基础版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.5.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 2. Spring Cloud 云原生基础 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2025.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 3. Spring Cloud Alibaba 阿里全套依赖核心(关键!) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2025.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
启动类#
@MapperScan("asia.liminality.user.mapper")
@SpringBootApplication
@Slf4j
public class UserApplication {
public static void main(String[] args) throws UnknownHostException {
ConfigurableApplicationContext app = SpringApplication.run(UserApplication.class, args);
Environment env = app.getEnvironment();
String protocol = "http";
if (env.getProperty("server.ssl.key-store") != null) {
protocol = "https";
}
log.info("--/\n---------------------------------------------------------------------------------------\n\t" +
"Application '{}' is running! Access URLs:\n\t" +
"Local: \t\t{}://localhost:{}\n\t" +
"External: \t{}://{}:{}\n\t" +
"Profile(s): \t{}" +
"\n---------------------------------------------------------------------------------------",
env.getProperty("spring.application.name"),
protocol,
env.getProperty("server.port"),
protocol,
InetAddress.getLocalHost().getHostAddress(),
env.getProperty("server.port"),
env.getActiveProfiles());
}
}
domain#
DTO#
Result#
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
private int code;
private String message;
private T data;
public static <T> Result<T> success(T data) {
return new Result<>(200, "success", data);
}
public static <T> Result<T> success() {
return new Result<>(200, "success", null);
}
public static <T> Result<T> failure(String message) {
return new Result<>(500, message, null);
}
public static <T> Result<T> failure(int code, String message) {
return new Result<>(code, message, null);
}
public static <T> Result<T> failure(String message, T data) {
return new Result<>(500, message, data);
}
}
Spring Cloud Gateway#
AuthGlobalFilter#
@Slf4j
@RequiredArgsConstructor
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
private final JwtUtil jwtUtil;
private static final List<String> WHITE_LIST = List.of(
"/auth/user/login",
"/auth/user/register"
);
// 判断是否在白名单内
private boolean isWhiteList(String path){
return WHITE_LIST.stream().anyMatch(path::startsWith);
}
private Mono<Void> reject(ServerWebExchange exchange){
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getPath().toString();
if (isWhiteList(path)) {
return chain.filter(exchange);
}
String token = request.getHeaders().getFirst("Authorization");
// 令牌为空,拒绝访问
if( token == null || token.isEmpty() ){
return reject( exchange );
}
// 验证令牌
try {
Integer userId = jwtUtil.parseToken(token);
// TODO userId 塞入请求头
log.info("🚪 塞入请求头");
} catch (Exception e) {
return reject(exchange);
}
return chain.filter( exchange );
}
// 过滤器优先级,越小越靠前
@Override
public int getOrder() {
return -1;
}
}