Java Controller 方法拦截

在Java开发中,Controller是处理Web请求的关键组件之一。但有时我们希望在Controller方法执行前或执行后进行一些操作,比如权限验证、日志记录等。这时就需要使用方法拦截器来实现这些需求。

什么是方法拦截器

方法拦截器是一种AOP(面向切面编程)的技术,它可以在方法执行前、执行后或执行异常时插入自定义的逻辑。在Java中,Spring框架提供了一种方便的方法拦截器实现方式。

实现方法拦截器

下面我们以Spring框架为例,演示如何实现方法拦截器。

  1. 首先创建一个拦截器类,继承HandlerInterceptorAdapter类,重写其中的preHandle、postHandle和afterCompletion方法。
public class MyInterceptor extends HandlerInterceptorAdapter {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在方法执行前执行的逻辑
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在方法执行后执行的逻辑
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在方法执行完成后执行的逻辑
    }
}
  1. 在配置文件中注册拦截器,并指定拦截的路径。
@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**");
    }
}

应用场景

方法拦截器可以应用于很多场景,比如:

  • 权限验证:在Controller方法执行前验证用户是否有权限访问该接口。
  • 日志记录:在Controller方法执行前或执行后记录请求信息、响应信息等。
  • 事务控制:在Controller方法执行前开启事务,在方法执行后提交或回滚事务。

实例演示

假设我们有一个旅行网站,用户需要登录后才能查看旅行路线。我们可以使用方法拦截器实现登录验证。

旅行网站功能流程

journey
    title 旅行网站功能流程
    section 用户登录
        登录页面-->用户输入账号密码: 输入账号密码
        用户输入账号密码-->后端Controller: 提交登录请求
        后端Controller-->拦截器: 验证用户登录状态
        拦截器-->后端Controller: 用户已登录
        后端Controller-->返回登录结果页面: 返回登录结果

用户登录序列图

sequenceDiagram
    participant 用户
    participant 前端页面
    participant 后端Controller
    participant 拦截器
    
    用户->>前端页面: 访问登录页面
    前端页面->>用户: 返回登录页面
    用户->>前端页面: 输入账号密码
    前端页面->>后端Controller: 提交登录请求
    后端Controller->>拦截器: 验证用户登录状态
    拦截器->>后端Controller: 用户已登录
    后端Controller->>前端页面: 返回登录结果页面

通过上面的例子,我们可以看到方法拦截器在Java开发中的重要作用。它可以帮助我们更方便地实现一些通用的功能,提高代码的复用性和可维护性。

在实际项目中,我们可以根据需求自定义不同的拦截器,实现更多的功能,提升系统的性能和安全性。希望本文能够帮助你更好地理解方法拦截器的使用和实现原理。