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
时,就会继续调用下一个Interceptor
的preHandle
方法,如果已经是最后一个Interceptor的时候,就会是调用当前请求的控制器中的方法。
postHandle
postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)
:
通过
preHandle
方法的解释,我们知道这个方法包括后面要说到的afterCompletion
方法都只能在当前所属的Interceptor的preHandle
方法的返回值为true的时候,才能被调用。postHandle
方法在当前请求进行处理之后,也就是在控制器中的方法调用之后执行,但是它会在DispatcherServlet
进行视图返回渲染之前被调用,所以我们可以在这个方法中对控制器处理之后的ModelAndView
对象进行操作。postHandle
方法被调用的方向跟preHandle
是相反的,也就是说,先声明的Interceptor
的postHandle
方法反而会后执行。
afterCompletion
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)
:
也是需要当前对应的
Interceptor
的preHandle
方法的返回值为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("执行完毕后执行");
}
}
网友评论