SpringBoot拦截器如何使用

这篇文章主要讲解了“SpringBoot拦截器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot拦截器如何使用”吧!

    定义拦截器

    拦截器:所谓拦截器,就是能够在进行某个操作之前拦截请求,如果请求符合条件就允许在往下执行。比如说,海关就是一个拦截器,他拦截进出口的货物,如果货物满足进出口条件,则放行,否则就拦截,退回处理。

    定义拦截器的几种方式:

    实现HandleInterceptor接口

    自定义拦截器类实现HandleInterceptor接口,并使用@Component注解标注为一个组件。

    public class MySelfInterceptor implements HandlerInterceptor {
    	@Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        	System.out.println("在业务处理器处理请求之前被调用");
        	return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    		System.out.println("在业务处理器处理请求执行完成后,生成视图之前执行");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    		System.out.println("在DispatcherServlet完全处理完请求后被调用");
        }
    }

    根据三种情况,可以在不同的方法针对请求进行额外的处理。
    在preHandle中,可以进行权限校验,安全控制。
    在postHandle中,可以对返回来的ModelAndView进行处理,这个时候还未渲染视图。
    在afterCompletion中,请求已经完成,页面已经渲染,数据已经返回。这个时候可以做一些资源清理,或者记录请求调用时间,做性能监控

    继承HandleInterceptorAdapter类

    自定义拦截器类继承HandleInterceptor接口的实现类HandleInterceptorAdapter来定义,并使用@Component注解标注为一个组件。建议使用此方式可以根据需要覆盖一些方法

    @Component
    public class MyInterceptor extends HandlerInterceptorAdapter {
    
        public SingleLoginInterceptor() {
            super();
        }
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return super.preHandle(request, response, handler);
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            super.afterCompletion(request, response, handler, ex);
        }
    
        @Override
        public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            super.afterConcurrentHandlingStarted(request, response, handler);
        }
    }

    可以看到HandlerInterceptorAdapter类底层是实现了HandlerInterceptor接口,多了两个方法,要比
    实现HandlerInterceptor接口的方式功能强大。
    这两个方法都是HandlerInterceptorAdapter类实现的org.springframework.web.servlet.AsyncHandlerInterceptor接口提供的,而AsyncHandlerInterceptor接口又继承了HandlerInterceptor接口,所以HandlerInterceptorAdapter底层是实现类HandlerInterceptor接口。

    SpringBoot拦截器如何使用