SpringMVC高级-拦截器如何正确运用?案例详解
springMVC:拦截器
实现了HandlerInterceptor接口。
作用:用来拦截控制器的
二.定义一个拦截器
1.环境搭建
@Component
public class Demo1Interceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}另外要注意:除了SpringMvc。我还整理了最新JAVA架构项目实战教程及大厂面试题库,有兴趣的可以进裙 783802103 免费获取,没基础勿进哦!
2、注册拦截器
@Configuration
@ComponentScan(basePackages={"com.czxy"})
@EnableWebMvc
public class MVCConfiguration extends WebMvcConfigurerAdapter{
/**
* 视图解析器
* @return
*/
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver(){
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/");
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
/*
* 注册拦截器
* */
//1、定义一个成员变量,获取拦截器对象(变量名=类名小驼峰)
@Resource
private HandlerInterceptor demo1Interceptor;
//2、重写注册拦截器方法,注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器(注册拦截器)
InterceptorRegistration i1 = registry.addInterceptor(demo1Interceptor);
//设置该拦截器的拦截路径
i1.addPathPatterns("/**");
}
}
3.代码实现
Demo1Interceptor:
@Component
public class Demo1Interceptor implements HandlerInterceptor {
/*
* 预处理方法:
* 执行某个控制器之前执行
* true:执行控制器方法(放行)
* false:拦截下来,不执行控制器方法(不放行、拦截)
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("demo1Interceptor-预处理方法");
return true;
}
/*
* 后处理方法:
* 某个控制器方法执行之后
* ModelAndView:用来修改控制器的跳转路径
* */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("demo1Interceptor-后处理方法");
}
/*
* 完成方法:
* 所有功能都执行完毕后,最后执行该方法
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("demo1Interceptor-完成方法");
}
}
4.注意事项:拦截器三大方法
- preHandle:预处理方法
是在控制器执行之前。
特殊:通过返回值控制 控制器是否执行。
true:放行,控制器执行
false:不放行、拦截,控制器不执行
适用环境:适用于在执行控制器之前进行判断。
- postHandle:后处理方法
前提:1、预处理方法,返回值true
2、控制器没有出现异常
在控制器执行之后执行。
适用环境:适用于在执行控制器之后,修改跳转路径/跳转方式
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.setViewName("errorMsg");
System.out.println("demo1Interceptor-后处理方法");
}
- afterCompletion:完成后方法
前提:预处理方法,返回值true
在所有流程执行之后执行,无论如何一定执行,相当于finally
适用环境:若未设置异常处理器,完成后方法可以进行异常处理
/*
* 完成后方法:
* 所有功能都执行完毕后,最后执行该方法
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("控制器出现的异常是:"+ex);
System.out.println("demo1Interceptor-完成方法");
}
5.注意事项:执行顺序图
6.注意事项:过滤器和拦截器区别
- 过滤器:
①实现了Filter接口
②用来拦截发给服务器的请求,或服务器内部的请求转发、包含、错误
③过滤器在servlet之前执行
④过滤器是web组件,拦截所有WEB资源
- 拦截器:
①实现了HandlerInterceptor接口
②仅用来拦截发给 控制器的请求,或服务器内部跳转控制器的请求转发
③拦截器在servlet之后,控制器之前执行
④拦截器是springMVC组件,负责拦截控制器
三. 定义多个拦截器
1.代码实现
Demo2Interceptor:
@Component
public class Demo2Interceptor implements HandlerInterceptor {
/*
* 预处理方法:
* 执行某个控制器之前执行
* true:执行控制器方法(放行)
* false:拦截下来,不执行控制器方法(不放行、拦截)
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("demo2Interceptor-预处理方法");
return true;
}
/*
* 后处理方法:
* 某个控制器方法执行之后
* ModelAndView:用来修改控制器的跳转路径。
* */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// modelAndView.setViewName("errorMsg");
System.out.println("demo2Interceptor-后处理方法");
}
/*
* 完成后方法:
* 所有功能都执行完毕后,最后执行该方法
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// System.out.println("控制器出现的异常是:"+ex);
System.out.println("demo2Interceptor-完成方法");
}
}
MVC配置类:
@Configuration
@ComponentScan(basePackages={"com.czxy"})
@EnableWebMvc
public class MVCConfiguration extends WebMvcConfigurerAdapter{
/**
* 视图解析器
* @return
*/
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver(){
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/");
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
/*
* 注册拦截器
* */
//1、定义一个成员变量,获取拦截器对象(变量名=类名小驼峰)
@Resource
private HandlerInterceptor demo1Interceptor;
@Resource
private HandlerInterceptor demo2Interceptor;
//2、重写注册拦截器方法,注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器(注册拦截器)
InterceptorRegistration i1 = registry.addInterceptor(demo1Interceptor);
//设置该拦截器的拦截路径
i1.addPathPatterns("/**");
//添加拦截器(注册拦截器)
InterceptorRegistration i2 = registry.addInterceptor(demo2Interceptor);
//设置该拦截器的拦截路径
i2.addPathPatterns("/**");
}
}
2.流程图
谁先注册,谁先执行。
四.springMVC-高级-拦截器通配符设置
通配符 |
说明 |
** |
任何0~多个字符 或 任意多层目录 例如:/user/** /user/a/b/c/run1.action /user/run1.action
|
* |
任何0~多个字符 例如:/user/* /user/run1.action /user/run2.action
|
? |
任意一个字符 例如:/user?/** /userA/run1.action /userb/run1.action /userc/run1.action |
总结:
拦截器:实现HandlerInterceptor接口。
拦截器:仅拦截控制器。
- 预处理方法:
在控制器执行之前执行。
True:放行。
False:拦截。
- 后处理方法:
在控制器正常执行之后。
前提:①预处理方法返回true
②控制器不能抛出异常
- 完成后方法:
在流程都结束之后。
前提:预处理方法返回true
最后注意:除了SpringMvc。我还整理了最新JAVA架构项目实战教程及大厂面试题库,有兴趣的可以进裙 783802103 免费获取,没基础勿进哦!
本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理