Spring MVC 拦截器
Spring MVC 拦截器主要作用是拦截用户的请求并进行相应的处理。应该场景有:登录认证拦截器(如商城判断用户是否登录),字符过滤拦截器(过滤低俗文字),日志操作拦截器等。
Spring MVC 中定义一个拦截器有两种方法:
- 实现HandlerInterceptor接口
- 实现WebRequestInterceptor接口
一、实现HandlerInterceptor接口
HandlerInterceptor接口中定义了三个方法,通过这三个方法,我们对用户的请求进行拦截处理。
preHandle()
在Controller方法之前执行,返回true表示继续执行,false表示拦截请求,不再向下执行。Spring MVC中的拦截器是链式调用,一个请求中可以同时存在多个拦截器。Spring MVC会依照配置文件中的顺序调用拦截器,每个拦截器最先执行的都是preHandle方法。当第一个拦截器的preHandle返回true时,会继续调用下一个拦截器的preHandle方法,如果最后一个拦截器的preHandle方法执行为true,则调用请求的Controller方法。多做权限判断,日志等操作。
postHandle()
在Controller方法之后执行,返回ModelAndView之前执行,可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。postHandle方法被调用的方向跟preHandle 是相反的,也就是说最先声明的拦截器的postHandle方法会最后被执行。可对请求域中的属性进行修改。
afterCompletion()
preHandle返回true,在View视图渲染后执行。根据拦截器定义的顺序,逆向执行。多用于资源清理等工作。
基本用法:
1、创建controller
1 2 3 4 5 6 7 | public class Interceptor1Controller { @RequestMapping ( "/handleRun" ) public String handleRun() { System.out.println( "业务处理器运行------------main" ); return "/page.jsp" ; } } |
2、创建拦截器类 Interceptor1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Interceptor1 implements HandlerInterceptor { // 预处理方法,在控制器的方法执行之前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println( "preHandle1" ); return true ; } // 后处理方法,在处理器执行之后,但是页面跳转之前执行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println( "postHandle1" ); } // 视图跳转结束之后执行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println( "afterCompletion1" ); } } |
3、在spring-mvc.xml中配置拦截器
1 2 3 4 5 6 7 8 9 | < mvc:interceptors > <!--可配置多个拦截器,也可配置全局拦截器--> < mvc:interceptor > <!-- 配置拦截器作用的路径 --> < mvc:mapping path="/**"/> <!--定义在<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截--> < bean class="com.noway.interceptor.Interceptor1"/> </ mvc:interceptor > </ mvc:interceptors > |
二、实现WebRequestInterceptor接口
WebRequestInterceptor接口同样定义了preHandle 、postHandle 和afterCompletion这三个方法,调用次序也相同。即preHandle是请求处理之前调用,postHandle在请求处理之后,视图渲染之前调用;afterCompletion是在视图渲染之后调用。但与HandlerInterceptor接口还是有所不同:
1. 方法参数不同。WebRequest是Spring定义的接口,它是对HttpServletRequest的封装。对WebRequest 进行的操作都将同步到HttpServletRequest 中。WebRequest 的set/getAttribute(name, value, scope)比HttpServletRequest 的set/getAttribute多了一个scope参数。它有三个取值:
SCOPE_REQUEST:它的值是0,表示request请求作用范围。
SCOPE_SESSION :它的值是1,表示session请求作用范围。
SCOPE_GLOBAL_SESSION :它的值是2 ,表示全局会话作用范围,即ServletContext上下文作用范围。
2. preHandle 方法。WebRequestInterceptor的该方法返回值为void,不是boolean。所以该方法不能用于请求阻断,一般用于资源准备。
3. postHandle 方法。preHandle 中准备的数据都可以通过参数WebRequest访问。ModelMap 是Controller 处理之后返回的Model 对象,可以通过改变它的属性来改变Model 对象模型,达到改变视图渲染效果的目的。
4. afterCompletion方法。Exception 参数表示的是当前请求的异常对象,如果Controller 抛出的异常已经被处理过,则Exception对象为null 。
三、拦截器与过滤器的区别
-
过滤器Filter依赖Servlet容器,基于回调函数,过滤范围大
-
拦截器Interceptor依赖框架容器,基于反射机制,只过滤请求
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端