SpringBoot拦截器浅析

  • Spring Boot 拦截器是 AOP 的一种实现
  • 专门拦截对Controller控制层的请求
  • 主要应用于判断用户权限,异常处理等

创建拦截器

  • 类只要实现HandlerInterceptor接口,即可成为拦截器类,其中有以下三个主要方法
方法 返回值 说明
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) boolean 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true表示继续向下执行,返回 false 表示中断后续操作。
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) void 该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) void 该方法在视图渲染结束后执行,可以通过此方法实现资源清理,记录日志信息等工作

eg:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author: solo
 * @date: 2023-01-31
 * @version: V1.0
 * @description: 创建自定义拦截器
 */
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 访问控制器方法前执行
     * @author solo
     * @date 2023-01-31 9:41
     * @param request
     * @param response
     * @param handler
     * @return boolean
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle:" + request.getRequestURL());
        return true;
    }

    /**
     * 访问控制器方法后执行
     * @author solo
     * @date 2023-01-31 9:40
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @return void
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle:" + request.getRequestURL());
    }

    /**
     * postHandle方法执行完成后执行,一般用于释放资源和日志处理
     * @author solo
     * @date 2023-01-31 9:40
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @return void
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion:" + request.getRequestURL());
    }
}

MyInterceptor 中的方法执行顺序为 preHandle -> Controller层方法 –> postHandle –> afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控和异常处理

配置拦截器

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author: solo
 * @date: 2023-01-31
 * @version: V1.0
 * @description:
 */
public class MyInterceptorConfig implements WebMvcConfigurer {

    /**
     * 添加拦截器
     * @author solo
     * @date 2023-01-31 9:48
     * @param registry
     * @return void
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截,放行登录页,登陆操作,静态资源等
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/", "/login", "/css/**", "/img/**", "/js/**");
    }
}
  • addPathPatterns方法用于指定拦截路径, /**代表拦截所有路径
  • excludePathPatterns方法用于排除拦截路径,指定不需要被拦截器拦截的请求
© 版权声明
THE END
喜欢就支持一下吧
点赞0打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容