美文网首页spring
Spring拦截器教程v1.0

Spring拦截器教程v1.0

作者: 刘军颖 | 来源:发表于2019-05-25 12:03 被阅读0次

    Spring拦截器

    什么是拦截器

    拦截器是Java动态拦截action调用对象,它的出现可以使得开发者在action执行前后,执行自己的代码逻辑,也可以在一个动作(action)执行前阻止其执行,应用场景很广泛,譬如:权限控制,登录等。

    如何实现拦截器

    既然是基于Spring拦截的,那么我们首先是要继承Spring拦截器的接口,去实现它提供的方法,从而达到我们自己要实现功能的拦截目的。

    HandlerInterceptor接口中定义了 3 个方法,分别为preHandle()postHandle()和afterCompletion(),我们就是通过复写这 3 个方法来对用户的请求进行拦截处理的。因此,我们可以通过直接实现HandlerInterceptor接口来实现拦截器的功能。

    preHandle

    preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):
    该方法在请求处理之前进行调用。一个方法中可以存在多个拦截器,而多个拦截器中的preHandle方法是按照控制器的使用顺序而执行的!
    该方法的返回值是布尔(Boolean)类型的,当它返回为false时,表示请求结束,后续的Interceptor控制器(Controller)都不会再执行;当返回值为true时,就会继续调用下一个InterceptorpreHandle方法,如果已经是最后一个Interceptor的时候,就会是调用当前请求的控制器中的方法。

    postHandle

    postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):

    通过preHandle方法的解释,我们知道这个方法包括后面要说到的afterCompletion方法都只能在当前所属的Interceptor的preHandle方法的返回值为true的时候,才能被调用。postHandle方法在当前请求进行处理之后,也就是在控制器中的方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对控制器处理之后的ModelAndView对象进行操作。postHandle方法被调用的方向跟preHandle是相反的,也就是说,先声明的InterceptorpostHandle方法反而会后执行。

    afterCompletion

    afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):

    也是需要当前对应的InterceptorpreHandle方法的返回值为true时才会执行。因此,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理的工作。

    实现一个拦截器步骤

    ①编写一个拦截器,继承HandlerInterceptor接口并实现需要实现的拦截器上述接口任意一种或多个。

    ②配置文件继承WebMvcConfigurer接口,并在类开始处开启自定义配置支持@EnableWebMvc

    ③添加一个bean,实例化拦截器,以方便注入

    ④重写WebMvcConfigurer接口中的addInterceptors方法,来注册拦截器

    具体实现拦截器代码Demo

    ①Spring配置文件实例

    @Configuration
    @EnableWebMvc
    @ComponentScan("com.haojishu.demo")
    public class MyMvcConfig implements WebMvcConfigurer  {
        @Bean
        public InternalResourceViewResolver viewResolver() {
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix("/WEB-INF/classes/views/");
            viewResolver.setSuffix(".jsp");
            viewResolver.setViewClass(JstlView.class);
            return viewResolver;
        }
        
        public void addInterceptors(InterceptorRegistry registry) {
            // TODO Auto-generated method stub
            registry.addInterceptor(demoInterceptor());
        }
        
        @Bean
        public DemoInterceptor demoInterceptor() {
            System.out.println("注册拦截器");
            return new DemoInterceptor();
        }
        
    }
    

    ②拦截器实例

    public class DemoInterceptor implements HandlerInterceptor  {
        
        public DemoInterceptor() {
            // TODO Auto-generated constructor stub
            System.out.println("构造方法执行");
        }
        
        @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,
                @Nullable ModelAndView modelAndView) throws Exception {
            System.out.println("执行完毕后执行");
        }
    }
    

    相关文章

      网友评论

        本文标题:Spring拦截器教程v1.0

        本文链接:https://www.haomeiwen.com/subject/jvmazqtx.html