SpringMVC拦截器详解(作用原理及代码例子)

SpringMVC拦截器详解(作用原理及代码例子)-mikechen

SpringMVC拦截器定义

Spring MVC拦截器是在请求到达控制器之前,或之后执行的拦截器。

 

SpringMVC拦截器作用

拦截器可以用来拦截请求并在请求被处理之前或之后执行一些操作,例如:记录日志、验证用户权限、修改请求参数等等。

 

SpringMVC拦截器使用配置

1.创建一个拦截器类

首先,需要创建一个实现了HandlerInterceptor接口的拦截器类。

如下所示:

public class MyInterceptor implements HandlerInterceptor {
// 在请求到达控制器之前执行的逻辑    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Interceptor preHandle method is running.");
        return true;
    }
// 在请求执行后、视图渲染之前执行的逻辑    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor postHandle method is running.");
    }
    
 // 在请求完成之后执行的逻辑
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor afterCompletion method is running.");
    }
}

在Spring MVC中,拦截器由HandlerInterceptor接口定义,它包含了三个方法:

  • preHandle:在请求到达控制器之前执行,返回值为boolean类型。如果返回true,请求将继续执行;如果返回false,请求将中止。
  • postHandle:在请求执行后,视图渲染之前执行。
  • afterCompletion:在请求完成之后执行,用于释放资源等操作。

 

2.在Spring MVC配置文件中添加拦截器

接下来,在Spring MVC配置文件中添加拦截器并配置拦截路径。

可以使用mvc:interceptors元素来添加拦截器,使用mvc:mapping元素来指定拦截路径,使用bean元素来指定拦截器实例。

如下所示:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.example.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

在这个例子中,我们创建了一个名为”MyInterceptor”的拦截器,并将其应用于所有以”/admin”开头的请求路径。

因此,只有当请求的路径符合”/admin”开头的规则时,才会触发拦截器。

 

3.运行应用程序并测试拦截器

最后,在应用程序中运行时,当发送一个请求到应用程序时,拦截器将会拦截请求并执行自定义的逻辑。

可以通过控制台或日志来查看拦截器的执行情况:

Interceptor preHandle method is running.
Interceptor postHandle method is running.
Interceptor afterCompletion method is running.

 

SpringMVC拦截器原理

SpringMVC拦截器原理主要涉及到拦截器的注册、拦截链的构建和拦截器的执行。

1.拦截器的注册

在SpringMVC配置文件中,我们可以通过mvc:interceptors标签或者@Bean注解来注册拦截器。

当SpringMVC应用启动时,这些拦截器会被注入到拦截器链中。

 

2.拦截链的构建

在SpringMVC中,所有的拦截器被组织成一个拦截器链,拦截器链的实现是通过InterceptorChain类来实现的。

InterceptorChain类维护了一个拦截器列表,每个拦截器都可以执行preHandle、postHandle和afterCompletion方法。

 

3.拦截器的执行

当客户端发送一个请求时,请求会先被DispatcherServlet拦截。

此时,DispatcherServlet会根据请求的URL路径和HTTP方法查找匹配的Handler,同时将拦截器链传递给HandlerExecutionChain。

 

4.视图的解析与渲染

当Handler执行完成后,Handler会返回一个ModelAndView对象,这个对象包含了视图的名称和数据模型。

DispatcherServlet会根据视图名称查找匹配的视图解析器,并将ModelAndView对象传递给它。

视图解析器会根据视图名称和数据模型生成相应的视图,并将其返回给客户端。

 

Spring MVC拦截器应用场景

Spring MVC拦截器的应用场景很多,例如:

  • 权限验证:拦截器可以用来验证用户的权限,如果用户没有权限,可以拦截请求并返回错误信息。
  • 记录日志:拦截器可以用来记录请求和响应的日志信息,方便开发人员进行调试。
  • 统一处理异常:拦截器可以用来统一处理异常信息,避免在每个控制器方法中都进行异常处理。
  • 修改请求参数:拦截器可以用来修改请求参数,例如对请求参数进行加密或解密

以上就是SpringMVC拦截器详解,更多SpringMVC请查看:SpringMVC教程(万字图文全面详解)

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法