Spring MVC的拦截器
程序员文章站
2022-03-25 17:17:38
原文链接: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项目步骤全纪录
-
SpringMVC+Spring+Mybatis实现支付宝支付功能的示例代码
-
Spring Boot 项目创建的详细步骤(图文)
-
Spring MVC 拦截器实现登录
-
Spring MVC+FastJson+Swagger集成的完整实例教程
-
在spring中使用自定义注解注册监听器的方法
-
Spring MVC+FastJson+hibernate-validator整合的完整实例教程
-
Spring Aop之AspectJ注解配置实现日志管理的方法
-
Spring Cloud 覆写远端的配置属性实例详解
-
Spring Boot 与 Kotlin 使用Redis数据库的配置方法