热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springmvc拦截器_SpringMVC拦截器的使用

拦截器简介SpringMVC中的拦截器(Interceptor)类似于Servler中的过滤器(Filter)。用于对处理器进行预处理和后处理。常用于日志记录、权限管理、性能监控、
a00c97cd80bb4bd31c0cb4c6c22d6cb4.png

拦截器简介

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 配置文件中配置顺序如下内容如下:






那么这两个拦截器中的处理方法和请求的处理方法的顺序如下图:

d42950cc962118354f9f7c2d3eeae449.png

实际应用举例

实现开发中,我们会要求一些页面需要登录后才能访问。未登录状态是无法得到访问权限的。这一小功能我们可以直接通过安全框架,类似 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:interceptor:定义一个拦截器
    • mvc:mapping:定义需要被拦截的路径
    • mvc:exclude-mapping:定义需要排除拦截的请求路径
    • bean class:指定拦截器对象



推荐阅读
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 在开发iOS应用时,面对不同状态(如数据加载成功、无数据、未登录、网络异常等)的界面管理,如何实现既高效又美观的用户体验?本文探讨了几种最佳实践方法。 ... [详细]
  • 本文详细介绍了如何在Spring框架中设置事件发布器、定义事件监听器及响应事件的具体步骤。通过实现ApplicationEventPublisherAware接口来创建事件发布器,利用ApplicationEvent类定义自定义事件,并通过ApplicationListener接口来处理这些事件。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 高级缩放示例.就像谷歌地图一样.它仅缩放图块,但不缩放整个图像.因此,缩放的瓷砖占据了恒定的记忆,并且不会为大型缩放图像调整大小的图像.对于简化的缩放示例lookhere.在Win ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • flea,frame,db,使用,之 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
你看看我的世界_420
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有