Spring MVC的拦截器
程序员文章站
2022-06-22 10:03:00
原文链接:http://www.yiidian.com/springmvc/interceptor.html Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日 ......
原文链接:
spring mvc中的拦截器(interceptor)类似于servlet中的过滤器(filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
要使用spring mvc中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
通过实现handlerinterceptor接口
继承handlerinterceptor接口的实现类(如:handlerinterceptoradapter)来定义。
1 编写目标控制器
首先,为了演示spring mvc拦截器的效果,我们先定义一个目标控制器
hellocontroller目标控制器:
package com.yiidian.controller; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.ui.modelmap; import org.springframework.web.bind.annotation.requestbody; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.responsebody; import org.springframework.web.multipart.multipartfile; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; import java.io.*; import java.util.uuid; /** * 目标控制器 * 一点教程网 - www.yiidian.com */ @controller public class hellocontroller { @requestmapping("/hello") public string upload(httpsession session, httpservletresponse response) throws exception { system.out.println("3.目标控制器-hellocontroller"); return "success"; } }
2 编写自定义拦截器
这里我们定义2个spring mvc拦截器,而且这2个拦截器同时拦截器一个目标控制器,大家注意看最后的执行顺序。
demo1interceptor第一个拦截器:
package com.yiidian.interceptor; import org.springframework.web.servlet.handlerinterceptor; import org.springframework.web.servlet.modelandview; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; /** * 自定义拦截器 *一点教程网 - www.yiidian.com */ public class demo1interceptor implements handlerinterceptor{ /** *prehandle: 在控制器(目标)的方法之前被执行 * 返回值:控制aftercompletion方法是否被执行 * true: 执行aftercompletion * false: 不执行aftercompletion */ @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { system.out.println("1.demo1interceptor的prehandle"); return true; } /** * posthandle: 在控制器(目标)的方法成功执行完成之后(注意:控制器方法失败不执行) */ @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception { system.out.println("5.demo1interceptor的posthandle"); } /** * aftercompletion: 在执行完前面所有(拦截器和目标)的方法之后执行(注意: 不管控制器方法执行成功与否都会被执行 ) */ @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception { system.out.println("7.demo1interceptor的aftercompletion"); } }
demo2interceptor第二个拦截器:
package com.yiidian.interceptor; import org.springframework.web.servlet.handlerinterceptor; import org.springframework.web.servlet.modelandview; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; /** * 自定义拦截器 *一点教程网 - www.yiidian.com */ public class demo2interceptor implements handlerinterceptor{ /** *prehandle: 在控制器(目标)的方法之前被执行 * 返回值:控制aftercompletion方法是否被执行 * true: 执行aftercompletion * false: 不执行aftercompletion */ @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { system.out.println("2.demo2interceptor的prehandle"); return true; } /** * posthandle: 在控制器(目标)的方法成功执行完成之后(注意:控制器方法失败不执行) */ @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception { system.out.println("4.demo2interceptor的posthandle"); } /** * aftercompletion: 在执行完前面所有(拦截器和目标)的方法之后执行(注意: 不管控制器方法执行成功与否都会被执行 ) */ @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception { system.out.println("6.demo2interceptor的aftercompletion"); } }
注意:一个拦截器和多个拦截器的执行顺序看下图。
一个拦截器的执行顺序:
多个拦截器的执行顺序:
3 springmvc.xml配置拦截器
<!-- 配置拦截器 --> <mvc:interceptors> <!-- 配置2个拦截器 --> <mvc:interceptor> <mvc:mapping path="/hello"/> <bean class="com.yiidian.interceptor.demo1interceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/hello"/> <bean class="com.yiidian.interceptor.demo2interceptor"/> </mvc:interceptor> </mvc:interceptors>
注意:拦截器配置的顺序决定了拦截器的执行顺序,先配置会先被执行!
4 运行测试
访问:
控制台输出效果如下:
源码下载:https://pan.baidu.com/s/1myzqcpvlhvb4ajkb5aucdq
欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
如果您对我的系列教程感兴趣,也可以关注我的网站:
上一篇: 曹操为何没能统一?他错过了哪些人才?
推荐阅读
-
十、Spring boot 简单优雅的整合 Swagger2
-
面试必问:Spring循环依赖的三种方式
-
Spring Boot 的静态资源处理
-
小白的springboot之路(十三)、过滤器、监听器、拦截器
-
Ioc依赖注入:Unity4.0.1 在项目中的应用 (MVC和API)
-
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(24)-权限管理系统-将权限授权给角色
-
[读书笔记] Spring MVC 学习指南 -- 第一章
-
Spring在代码中获取bean的几种方式详解
-
spring boot 枚举使用的坑整理
-
浅谈Spring Security 对于静态资源的拦截与放行