SpringMVC 中的Interceptor 拦截器(HandlerInteceptor)

本文详细介绍了SpringMVC中Interceptor的作用、实现步骤,包括HandlerInterceptor和WebRequestInterceptor接口的使用,以及如何将拦截器加入到SpringMVC拦截体系中。Interceptor可用于权限检查、日志记录、性能监控等场景,其运行流程遵循AOP思想。同时,文章提到了Filter作为另一种拦截请求的方式,推荐在通用场景下使用。
摘要由CSDN通过智能技术生成

作用

一切请求都可以进去拦截,然后添加前后的处理逻辑
有点像是AOP
可以用在
1、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
2、像12306 那样子判断当前时间是否是购票时间。
3、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
4、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。
…………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。

实现步骤

1、定义Interceptor实现类(HandlerInterceptor)或者 实现WebRequestInterceptor 接口

2、把定义的拦截器类加到SpringMVC的拦截体系中
      2.1、在SpringMVC的配置文件中加上支持MVC的schema

 <!--mvc标签中有一个mvc:interceptors是用于声明SpringMVC的拦截器的。-->
 xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation=" http://www.springframework.org/schema/mvc  
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"  

      2.2、使用mvc:interceptors标签来声明需要加入到SpringMVC拦截器链中的拦截器

<mvc:interceptors>  
    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->  
    <bean class="com.host.app.web.interceptor.AllInterceptor"/>  
    <mvc:interceptor>  
        <mvc:mapping path="/test/number.do"/>  
        <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->  
        <bean class="com.host.app.web.interceptor.LoginInterceptor"/>  
    </mvc:interceptor>  
</mvc:interceptors>  

定义Interceptor实现类

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。
1、第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;
2、第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现 WebRequestInterceptor的类。

实现HandlerInterceptor接口(法一)

preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法

顾名思义,该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。

postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法

由preHandle

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC自定义拦截器有以下步骤: 1. 创建一个实现HandlerInterceptor接口的拦截器类。在该类实现preHandle、postHandle、afterCompletion三个方法。 2. 在Spring配置文件配置该拦截器。可以使用<mvc:interceptors>标签配置,也可以使用注解@Configuration和@EnableWebMvc配置。 3. 配置拦截器的拦截规则。可以使用<mvc:interceptor>标签配置,也可以使用注解@Interceptor和@Order配置。 4. 使用拦截器。在Controller类或方法上使用注解@Interceptor或@WebMvcConfigurerAdapter.addInterceptors()方法添加拦截器。 以下是一个简单的示例: 1. 创建拦截器类 public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor afterCompletion"); } } 2. 配置拦截器 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.example.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> 3. 配置拦截规则 @Interceptor @Order(1) public class MyInterceptor implements HandlerInterceptor { ... } 4. 使用拦截器 @Controller public class MyController { @Interceptor(MyInterceptor.class) @RequestMapping("/hello") public String hello() { return "hello"; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值