Spring Boot MVC 扩展详解¶
本章聚焦于前后端分离架构下 Spring Boot MVC 的核心扩展与应用,系统讲解拦截器、过滤器、CORS、静态资源、国际化配置,并通过通信流程图和时序图展示整个请求生命周期。
一、课程目标¶
通过本章学习,你将掌握:
- Spring Boot MVC 在前后端分离架构中的角色和职责
- CORS 跨域机制与全局配置方法
- 拦截器与过滤器的作用、区别与执行时机
- 前端打包与后端静态资源整合(前后端一体化部署)
- 国际化(i18n)配置与语言切换
- 请求完整执行流程及实战配置案例
🌐 二、前后端通信架构图¶
前后端分离系统中,浏览器与后端通过 HTTP API(JSON) 进行交互。
Spring Boot 主要负责处理业务逻辑、鉴权、数据访问与响应生成。
sequenceDiagram
participant Browser as 前端 (Vue/React)
participant Filter as Filter (过滤器)
participant Interceptor as Interceptor (拦截器)
participant Dispatcher as DispatcherServlet
participant Controller as Controller
participant Service as Service层
participant DB as 数据库
Browser->>Filter: 发送 HTTP 请求
Filter->>Interceptor: 请求通过过滤器链
Interceptor->>Dispatcher: 进入 DispatcherServlet
Dispatcher->>Controller: 路由匹配 Controller
Controller->>Service: 调用业务逻辑
Service->>DB: 查询或写入数据库
DB-->>Service: 返回数据
Service-->>Controller: 返回结果对象
Controller-->>Interceptor: 返回响应
Interceptor-->>Filter: afterCompletion() 执行
Filter-->>Browser: 返回 JSON 响应
🧩 三、Spring Boot MVC 在前后端分离中的职责¶
| 模块 | 职责 | 常用技术 |
|---|---|---|
| Controller | 接收请求 / 返回 JSON | @RestController, @RequestMapping |
| Service | 业务逻辑处理 | @Service, 事务、缓存 |
| Repository | 数据访问层 | JPA / MyBatis / Redis |
| Interceptor | 请求前后处理 | 登录校验、权限、日志 |
| Filter | 全局过滤 | XSS、编码、IP控制 |
| CORS | 解决跨域 | @CrossOrigin, CorsRegistry |
🔗 四、CORS 跨域资源共享¶
1️⃣ 为什么会出现跨域问题?¶
浏览器出于安全考虑,默认禁止前端脚本访问不同源(协议/域名/端口)的接口。
例如:http://localhost:5173 访问 http://localhost:8080 就会被拦截。
2️⃣ 全局 CORS 配置¶
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
3️⃣ 单接口 CORS 示例¶
@RestController
@RequestMapping("/api/users")
@CrossOrigin(origins = "http://localhost:5173")
public class UserController {
@GetMapping
public List<User> list() { return service.findAll(); }
}
✅ 推荐:开发环境开启全局 CORS,生产环境限制指定域名。
🚧 五、拦截器(Interceptor)¶
1️⃣ 概念¶
拦截器作用于 Controller 前后,是实现登录校验、权限验证、日志统计的常用机制。
2️⃣ 生命周期方法¶
| 方法 | 执行时机 | 常用用途 |
|---|---|---|
preHandle() |
Controller 之前 | 登录鉴权、限流控制 |
postHandle() |
Controller 执行后、视图渲染前 | 修改响应数据 |
afterCompletion() |
请求结束后 | 清理资源、日志输出 |
3️⃣ 登录校验拦截器示例¶
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
String token = req.getHeader("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
return true;
}
}
4️⃣ 注册拦截器¶
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/api/auth/**");
}
}
🧱 六、过滤器(Filter)¶
1️⃣ 作用与特性¶
过滤器在 DispatcherServlet 之前执行,适用于请求预处理(日志、XSS、编码)。
2️⃣ 示例¶
@Component
@Order(1)
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
System.out.println("Filter: " + request.getMethod() + " " + request.getRequestURI());
chain.doFilter(req, res);
}
}
3️⃣ Filter 与 Interceptor 对比¶
| 对比项 | Filter | Interceptor |
|---|---|---|
| 执行位置 | DispatcherServlet 之前 | Controller 调用前后 |
| 拦截范围 | 所有请求(含静态资源) | 仅 MVC 控制器请求 |
| 主要用途 | 日志、XSS、CORS | 登录、权限、限流 |
| 注册方式 | @WebFilter / FilterRegistrationBean |
WebMvcConfigurer.addInterceptors() |
📦 七、静态资源与一体化部署(补充)¶
在前后端分离架构中,前端通常独立部署。
但若需要一体打包(如内网系统),可将前端构建产物放入 Spring Boot static/ 目录。
npm run build
cp -r dist/* src/main/resources/static/
访问地址即为 http://localhost:8080/。
🌍 八、国际化(i18n)¶
spring:
messages:
basename: i18n/messages
encoding: UTF-8
文件结构:
src/main/resources/i18n/
├── messages.properties
├── messages_en_US.properties
└── messages_ja_JP.properties
@GetMapping("/hello")
public String hello(Locale locale) {
return messageSource.getMessage("welcome.message", null, locale);
}
访问 /hello?lang=en 即切换语言。
⚙️ 九、完整请求执行流程图¶
flowchart TD
A[Browser / Frontend] --> B[Filter]
B --> C[Interceptor preHandle]
C --> D[DispatcherServlet]
D --> E[Controller]
E --> F[Service / DB]
F --> G[Controller 返回数据]
G --> H[Interceptor postHandle & afterCompletion]
H --> I[Filter Response]
I --> J[Browser: JSON Response]
🧪 十、综合实战配置¶
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final AuthInterceptor authInterceptor;
public WebConfig(AuthInterceptor authInterceptor) { this.authInterceptor = authInterceptor; }
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor).addPathPatterns("/api/**").excludePathPatterns("/api/auth/**");
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**").allowedOrigins("http://localhost:5173").allowedMethods("*").allowCredentials(true);
}
}
💡 总结:
- Filter 在最外层执行,请求预处理。
- Interceptor 在业务层前后切入,适合权限控制。
- CORS 是前后端通信的基础配置。
- MVC 的灵活扩展能力让 Spring Boot 成为现代前后端分离架构的坚实后端支撑。