spring

Spring拦截器教程v1.0

2019-05-25  本文已影响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("执行完毕后执行");
    }
}
上一篇下一篇

猜你喜欢

热点阅读