Spring MVC 拦截器 interceptor 用法详解

Spring MVC 拦截器(Interceptor)用法详解

什么是拦截器

拦截器是Spring MVC框架中的一种增强处理器,拦截器也可以称为过滤器(Filter)或者AOP实现,它可以在请求处理的过程中预处理请求、处理请求和处理完请求后进行后续处理。拦截器可以将特定的处理逻辑应用到整个应用程序或者某个特定的Controller中。

和Servlet的过滤器(Filter)相比较,拦截器可以获取Spring IoC容器中的Bean,并利用依赖注入和AOP技术对目标代码进行更具体的处理,因此拦截器的应用范围远比过滤器广泛。

使用拦截器的原因

拦截器本质上就是对目标请求进行预处理和后处理,它可以使得我们在请求处理的前后执行我们自己的代码,比如对请求进行安全性检查、记录日志等操作,而无需进入具体的业务处理逻辑中。拦截器对于那些不需要更复杂的过滤器逻辑,但又需要在某些场景中进行拦截和处理的场景非常适用。

拦截器的配置方法

事实上,在Spring MVC中使用拦截器非常简单,只需要完成以下三个步骤。

步骤一:拦截器的实现

实现自己的拦截器类,实现HandlerInterceptor接口,并实现以下三个方法:

public interface HandlerInterceptor {

   boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;

   void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;

   void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}

三个接口方法的作用详解:

  • preHandle: 在请求之前进行调用,也就是在Controller方法调用之前。

  • postHandle: 在请求之后调用,也就是在Controller方法调用之后,但是渲染视图之前。

  • afterCompletion: 在整个请求处理完成后进行调用,也就是在视图渲染完毕或者调用方取消时(比如当请求出现异常)。

步骤二:拦截器的注册

拦截器的注册过程非常类似于Spring IoC容器对Bean的注册,只不过是使用了一种专门的注解@Configuration,然后将拦截器的实例化对象添加到spring的上下文之中。

以下是部分示例代码,并未涉及全部内容,请结合实际代码食用

示例一:对请求进行日志记录

目的:记录每个请求的url、请求参数、响应时间。

首先,我们需要编写一个拦截器类,键入以下代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogInterceptor implements HandlerInterceptor {

    private static Logger logger = LoggerFactory.getLogger(LogInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("Request [{}] URL: {}", request.getMethod(), request.getRequestURL().toString());
        logger.info("Request params: {}", request.getParameterMap().toString());
        request.setAttribute("startTime", System.currentTimeMillis()); //记录开始时间
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        long startTime = (long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        logger.info("Response time: {}ms", endTime - startTime);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // Do nothing here.
    }
}

我们通过实现HandlerInterceptor接口来实现自己的拦截器,这个拦截器简单地将请求的URL和参数记录到log中,并在请求结束时计算响应时间。

接下来,我们需要在Spring MVC中注册这个拦截器。打开Spring配置文件,新增如下配置:

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

这段配置包含了一个拦截器LogInterceptor和路径/**,意味着我们将会监控所有的请求并且记录下日志。

示例二:请求防重复提交

至于本例子的目的,由于网上很多存在前后端分离实现的方式,所以这里只针对后端表单提交进行课程。

  • 以提交的url为唯一性校验点,对重复提交进行防范。

在前端给提交按钮添加一个token字段,后端对于这个token进行判定,防止多次提交。

首先,我们需要在拦截器中保存已处理过的请求URL,实现如下:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashSet;
import java.util.Set;

public class TokenInterceptor implements HandlerInterceptor {
    private static final Set<String> URL_SET = new HashSet<>(); //保存请求URL

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        final String url = request.getRequestURL().toString();
        synchronized (URL_SET) {
            if (URL_SET.contains(url)) {
                return false;
            }
            URL_SET.add(url);
        }
        request.setAttribute("token", url);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        final String url = request.getAttribute("token").toString();
        synchronized (URL_SET) {
            URL_SET.remove(url);
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
}

接下来,我们需要在Spring MVC中注册这个拦截器:

<mvc:interceptors>
   <mvc:interceptor>
       <mvc:mapping path="/form" />
       <bean class="com.yourpackage.TokenInterceptor" />
   </mvc:interceptor>
</mvc:interceptors>

这段配置设置了拦截路径/form,意味只有带有该路径的请求才会进行防重复提交的拦截处理。

总结

本文介绍了Spring MVC中拦截器的使用方法,为开发者实现增强的请求处理提供了一种便利、高效的方式。值得注意的是,拦截器需要遵循Spring MVC部分原则,比如需要放在Contexts中,并且需要先于业务逻辑被执行。在设计拦截器的过程中,经验和设计能力至关重要。

文章仅作参考,请结合实际开发进行食用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring MVC 拦截器 interceptor 用法详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Vue集成Iframe页面的方法示例

    关于Vue集成Iframe页面的方法示例,以下是我整理的详细攻略: 步骤一:在Vue项目中安装Vue-iframe插件 在Vue项目中集成Iframe页面首先需要安装Vue-iframe插件。Vue-iframe插件是专门用于在Vue项目中嵌入Iframe页面的插件,可以快速简单地实现Iframe页面的嵌入。在终端中执行以下命令即可完成Vue-iframe插…

    Java 2023年6月15日
    00
  • 在Java的Hibernate框架中对数据库数据进行查询操作

    下面是在Java的Hibernate框架中对数据库数据进行查询操作的完整攻略,过程中包含两条示例。 1. 准备工作 在进行数据库查询操作之前,需要做好以下准备工作: 确保已经安装并配置好Hibernate框架。 在Hibernate配置文件中配置好数据源。 编写实体类,并在实体类中使用Hibernate注解进行属性和数据库字段的映射。 使用Hibernate…

    Java 2023年5月19日
    00
  • 详解使用@RequestBody取POST方式的json字符串

    下面我将详细讲解使用@RequestBody取POST方式的json字符串的完整攻略。 什么是@RequestBody @RequestBody 是Spring框架提供的注解,通常用于接收前端传来的JSON格式的数据。在处理来自前端的POST请求时,Spring会自动解析标有@RequestBody 注解的参数,并将请求体中的JSON字符串转换为对应的Jav…

    Java 2023年5月26日
    00
  • 关于MyBatis10种超好用的写法(收藏)

    下面我将为你详细讲解“关于MyBatis10种超好用的写法(收藏)”的完整攻略。 首先,这篇攻略详细介绍了 MyBatis 框架的 10 种超好用的写法,这包括代码优化、动态SQL、可重用的SQL段等等。具体的写法包括: MyBatis 缓存优化 MyBatis 批处理插入 MyBatis 动态表名 MyBatis 动态 SQL MyBatis In 操作简…

    Java 2023年6月1日
    00
  • SpringBoot路径映射实现过程图解

    下面是关于“SpringBoot路径映射实现过程图解”的完整攻略,包含两个示例说明。 SpringBoot路径映射实现过程图解 在SpringBoot中,我们可以使用注解来实现路径映射。路径映射是指将HTTP请求映射到相应的处理方法上。本文将介绍SpringBoot中路径映射的实现过程,并提供两个示例说明。 实现过程 在SpringBoot中,我们可以使用@…

    Java 2023年5月17日
    00
  • SpringBoot使用JdbcTemplate访问操作数据库基本用法

    SpringBoot使用JdbcTemplate访问操作数据库基本用法 简介 JdbcTemplate 是 Spring 框架提供的一种基于 JDBC 的访问数据库的工具,使用它可以简化 JDBC 的开发流程和操作,减少大量模板式代码的编写。结合 SpringBoot 使用 JdbcTemplate 可以更加方便地访问和操作数据库。 Maven 依赖 在 S…

    Java 2023年5月20日
    00
  • Spring Boot应用程序中如何使用Keycloak详解

    Spring Boot应用程序中如何使用Keycloak详解 Keycloak是一个强大的、开源、易于使用的认证和授权管理解决方案。Spring Boot提供了与Keycloak的集成,可以轻松地保护和管理您的应用程序。 本文将介绍如何在Spring Boot应用程序中快速集成Keycloak,以便您的Web应用程序能够以安全的方式使用它。 准备工作 在开始…

    Java 2023年5月20日
    00
  • 微信小程序学习总结(二)样式、属性、模板操作分析

    “微信小程序学习总结(二)样式、属性、模板操作分析”是一篇关于微信小程序开发中样式、属性和模板操作的总结文章。在这篇文章中,作者讲解了小程序中涉及到的样式、属性和模板的操作方法,同时给出了一些示例,方便读者了解和掌握这些操作的具体方法。 一、样式操作: 小程序的样式操作主要涉及到对组件样式表的修改。在小程序中,我们可以通过以下两种方式来修改组件的样式: 内联…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部