Spring MVC拦截器详解及实例代码
- 发布时间:2023-09-23 22:14:04
- 本文热度:浏览 684 赞 0 评论 0
- 文章标签: Spring Java Spring MVC
- 全文共1字,阅读约需1分钟
1、Spring MVC中的拦截器介绍
在 Spring MVC 中,拦截器是一种非常重要的组件,用于对请求进行拦截和处理。拦截器可以在请求到达 Controller 之前或之后进行处理,常用于实现日志记录、权限验证、参数预处理等功能。本文将介绍 Spring MVC 中拦截器的原理和实现方式,并给出示例代码和测试代码来加强阐述。
2、拦截器的工作原理
拦截器是基于 Java 的反射机制实现的,通过动态代理的方式,在请求到达 Controller 之前或之后,进行预处理或后处理。拦截器可以对请求进行拦截、修改请求参数、修改响应结果等操作。在 Spring MVC 中,拦截器是通过 HandlerInterceptor
接口来实现的,该接口定义了三个方法:
preHandle
方法:在请求到达 Controller 之前执行,可以进行一些预处理操作,如权限验证、日志记录等。如果该方法返回false
,则请求将被拦截,不再继续处理。postHandle
方法:请求到达 Controller 后,但在视图渲染之前执行。可以对请求参数或响应结果进行修改。afterCompletion
方法:在视图渲染完成后执行,用于进行一些清理工作,如关闭资源等。
3、拦截器的实现方式
在 Spring MVC 中,拦截器的实现方式有两种:通过配置文件和通过注解。
3.1、通过配置文件实现拦截器
首先,我们需要在 Spring MVC 配置文件(通常是 springmvc.xml
)中定义拦截器,并指定拦截器的拦截路径。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- 拦截所有请求 -->
<bean class="com.example.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
上述代码中,我们通过 <mvc:interceptors>
标签来定义拦截器,然后通过 <mvc:interceptor>
标签指定拦截器的拦截路径和实现类。
3.2、通过注解实现拦截器
除了通过配置文件,我们还可以通过注解的方式实现拦截器。首先,我们需要在拦截器类上添加 @Component
注解,以及 @Interceptor
注解来指定拦截器的拦截路径。
@Component
@Interceptor(urlPatterns = "/*")
public class MyInterceptor implements HandlerInterceptor {
// 实现拦截器的方法
}
上述代码中,我们将拦截器类标记为组件,然后使用 @Interceptor
注解来指定拦截器的拦截路径。
4、拦截器示例代码
接下来,我们来具体实现一个拦截器并进行示例代码的编写。
@Component
@Interceptor(urlPatterns = "/user/*")
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null || !token.equals("abc123")) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理完成后,可以对响应结果进行修改
modelAndView.addObject("username", "John Doe");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在视图渲染完成后,进行清理工作
}
}
上述代码中,我们实现了一个用于权限验证的拦截器 AuthInterceptor
。在 preHandle
方法中,我们从请求头中获取 Authorization token,并进行验证。如果验证失败,则返回 401 Unauthorized
状态码,拦截该请求。
在 postHandle
方法中,我们可以对响应的 ModelAndView
进行修改,例如添加一些额外的属性。
5、拦截器测试代码
为了验证拦截器的功能,我们使用 JUnit 编写测试代码。
@RunWith(SpringRunner.class)
@SpringBootTest
public class AuthInterceptorTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testAuthInterceptor() throws Exception {
mockMvc.perform(get("/user/profile")
.header("Authorization", "abc123"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.username").value("John Doe"));
}
}
上述代码中,我们使用 MockMvc
来模拟发送请求,并使用 andExpect
断言来验证请求处理的结果。在这个示例中,我们发送了一个带有正确 Authorization token 的请求,预期得到返回状态码 200,并且返回的 JSON 数据中包含了 username。
6、总结
本文介绍了 Spring MVC 中拦截器的原理和实现方式。拦截器可以用于在请求到达 Controller 之前或之后进行处理,常用于实现日志记录、权限验证等功能。在 Spring MVC 中,拦截器可以通过配置文件或注解来实现。通过示例代码和测试代码的演示,我们展示了一个用于权限验证的拦截器的实现和测试。