spring mvc 拦截器的使用
Spring MVC 拦截器的使用
拦截器简介
Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter)。用于对处理器进行预处理和后处理。常用于日志记录、权限管理、性能监控、通用行为等。
拦截器的实现
Spring MVC 中的拦截器需要我们手动实现和配置。拦截器可以通过以下两种方式定义
- 实现
HandleInterceptor
接口,或者继承该接口的实现类如HandleInterceptorAdapter
来定义一个拦截器; - 实现
WebRequestInterceptor
接口来定义一个拦截器;
HandleInterceptor 接口
我们主要讲解下实现 HandleInterceptor
接口来创建拦截器。HandleInterceptor
接口定义了三个方法,分别为 preHandle()
, postHandle()
, afterCompletion()
,我们需要重写这三个方法,从而来实现我们定义拦截器的目的。
preHandle(HttpServletRequest request, HttpServletResponse response, Object handle)
:该方法在请求处理前调用。Spring MVC 中的拦截器是链式调用的,一个请求可以被多个拦截器拦截,但是 Interceptor 会根据被声明的次序依次被调用执行,而不会同时去拦截。而且所有 Interceptor 中的preHandle
函数都会最先被调用,所以这个方法中可以进行一些前置初始化操作或者是对当前请求的预处理,或者设置一些判断来决定该请求是否执行下去。该方法的返回值是布尔值,当它返回true
时,之后的 Interceptor 和 controller 都不会执行下去了;当它返回false
时,就会继续调用下一个 Interceptor 的preHandle
方法或者处理当前请求的Controller
。postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)
:该方法只有在perHandle
方法返回值为true
时,在 Controller 执行完当前请求后才会执行。咋一看好像和之后要介绍的 afterCompletion 方法没有不同,但是这个方法会在DispatcherServlet
进行视图渲染之前被调用,所以咱们可以在这个方法中对 Controller 处理之后的ModelAndView
对象进行操作。afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)
:该方法在整个请求结束后,也就是DispatcherServlet
渲染了对应视图之后执行,这个方法的主要作用是用于进行资源清理的工作。
假设我们现在定义了两个拦截器,xml 配置文件中配置顺序如下内容如下:
<!-- 拦截器1 -->
<mvc:interceptor>
<!--配置拦截器的作用路径-->
<mvc:mapping path="/**"/>
<bean class="com.jojo.test.interceptor.Intercptor1"/>
</mvc:interceptor>
<!--拦截器2-->
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean class="com.jojo.test.interceptor.Interceptor2"/>
</mvc:interceptor>
那么这两个拦截器中的处理方法和请求的处理方法的顺序如下图:
实际应用举例
实现开发中,我们会要求一些页面需要登录后才能访问。未登录状态是无法得到访问权限的。这一小功能我们可以直接通过安全框架,类似 Spring Security 或者 shiro 来实现,不过我们现在利用 Spring MVC 这一功能来实现一下:
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
User user = (User) httpServletRequest.getSession().getAttribute("user");
if (user == null) {
// 用户未登录,重定向到登录页
httpServletResponse.sendRedirect("/login");
return false;
}
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
我们还需要在 spring-mvc
中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/static/**"/>
<mvc:exclude-mapping path="/login"/>
<bean class="com.jojo.test.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
相关配置说明:
mvc:interceptor
:定义一个拦截器mvc:mapping
:定义需要被拦截的路径mvc:exclude-mapping
:定义需要排除拦截的请求路径bean class
:指定拦截器对象
spring mvc 拦截器的使用的更多相关文章
- SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器
目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)
拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现, ...
- Spring MVC拦截器配置
Spring MVC拦截器配置 (1)自定义拦截器 package learnspringboot.xiao.other; import org.springframework.web.servlet ...
- 写的太细了!Spring MVC拦截器的应用,建议收藏再看!
Spring MVC拦截器 拦截器是Spring MVC中强大的控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作. 拦截器概述 对于任何优秀的MVC框架, ...
- 对于Spring MVC 拦截器的一些了解
Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission lo ...
- Spring MVC拦截器浅析
Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...
- spring MVC拦截器01
spring MVC拦截 作用:身份校验,权限检查,防止非法訪问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法添加分类,无法删除博文. sp ...
- spring mvc拦截器原理分析
我的springMVC+mybatis中的interceptor使用@autowired注入DAO失败,导致报空指针错误,这个是为什么呢? :空指针说明没有注入进来,你可以检查一下你的这个拦截器int ...
随机推荐
- NuGet安装包重新安装
Update-Package -reinstall 引用: https://docs.microsoft.com/zh-cn/nuget/consume-packages/reinstalling-a ...
- UWP-磁贴初识
原文:UWP-磁贴初识 简单的磁贴内容实现,来自 Bob 的视频. 为一个按钮添加点击事件,来更新磁贴. private void ChangeTileContentButton_Click(obje ...
- Android零基础入门第74节:Activity启动和关闭
上一期我们学习了Activity的创建和配置,当时留了一个悬念,如何才能在默认启动的Activity中打开其他新建的Activity呢?那么本期一起来学习如何启动和关闭Activity. 一.概述 经 ...
- 一顶博士帽能带来什么——访GOOGLE公司中国区总裁李开复
在读了博士生远潇给本报的来信后,GOOGLE公司中国区总裁李开复说,有这些困惑和担心,实际上是很多博士生们在读博士之前并没有认真地想过,自己是不是能耐得住寂寞做学问,是不是能抵御来自物质世界的诱惑 ...
- Qt Quick 事件处理之信号与槽(foruok的博客)
前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简 ...
- linux oracle 启动全过程
一:启动oracle [root@ccoracle ~]# su -l oracle [oracle@ccoracle ~]$ sqlplus /nolog SQL*Plus: Release 10. ...
- SYN4104型 数字网同步时钟
SYN4104型 数字网同步时钟 产品概述 SYN4104型数字网同步时钟是由西安同步电子科技有限公司精心设计.自行研发生产的一款高精度锁相时钟频率源,接收GPS信号,使恒温晶振输出频率同步于GPS卫 ...
- Python时间戳的一些使用
Python时间戳的一些使用 为什么写下这篇文档? 由于我本身是做Python爬虫的,在爬取网站的过程当中,会遇到形形色色的验证码,目前对于自己而言,可能简单的验证码可以进行自己识别 发现大多数的网站 ...
- spring cloud 系列第8篇 —— config+bus 分布式配置中心与配置热刷新 (F版本)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.config 简介 spring cloud config 分为服务端 ...
- mysql group_concat的长度问题
mysql group_concat的长度问题 show variables like 'group_concat_max_len';+----------------------+-------+| ...