Spring MVC拦截器详解及实例代码

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 中,拦截器可以通过配置文件或注解来实现。通过示例代码和测试代码的演示,我们展示了一个用于权限验证的拦截器的实现和测试。

正文到此结束
评论插件初始化中...
Loading...