SpringMVC高级-拦截器如何正确运用?案例详解
2020-05-21 16:05:55来源:博客园 阅读 ()
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 免费获取,没基础勿进哦!
本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理
原文链接:https://www.cnblogs.com/chengxuyuanaa/p/12930166.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- Java高级实战Maven+JSP+SSM+Mysql实现的音乐网站,70%人不会 2020-06-04
- springboot~拦截器的使用场景 2020-05-28
- 蚂蚁金服这套SpringMvc面试题你懂多少(面试必刷) 2020-05-27
- Java高级架构师开发十年精选电子书及最新面试题,你要的全都 2020-05-21
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash