Springboot项目快速实现拦截器功能

针对“Springboot项目快速实现拦截器功能”,我可以提供以下完整攻略:

1. 引入依赖

在pom.xml中添加如下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>2.4.3</version>
</dependency>

2. 编写拦截器

在springBoot中,实现自定义拦截器需要实现HandlerInterceptor接口,该接口包含三个方法:

  • preHandle():在请求处理之前进行调用(Controller方法调用之前)。
  • postHandle():请求处理之后进行调用,但是在视图被渲染之前,即在返回ModelAndView之前调用(Controller方法调用之后)。
  • afterCompletion():在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于清理资源等工作)。

下面给出一个简单的示例代码,可以实现对请求的耗时进行统计的功能:

public class TimeInterceptor implements HandlerInterceptor {
  private static final Logger logger = LoggerFactory.getLogger(TimeInterceptor.class);

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      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");
      logger.info("请求耗时:{} ms", System.currentTimeMillis() - startTime);
  }

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

3. 注册拦截器

在springBoot中,需要通过WebMvcConfigurer来注册拦截器,示例代码如下:

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new TimeInterceptor()).addPathPatterns("/**");
  }
}

其中,addPathPatterns("/**")表示需要拦截所有请求。

示例1

在上面的示例中,我们只是简单地打印了请求的耗时。现在我们来看一个更加实际一些的例子。

需求:拦截需要登录的接口,只有在登录状态下才能访问。

首先,我们需要在HttpServletRequest中获取session中的信息判断是否登录,示例代码如下:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    HttpSession session = request.getSession();
    Object user = session.getAttribute("userInfo");
    if (user == null) {
        response.sendRedirect("/login");
        return false;
    }
    return true;
}

在上面代码中,我们判断了session中是否存在userInfo信息,如果不存在,则跳转到登录页面。如果存在,则直接返回true,表示继续执行下面的接口方法。

示例2

除了判断登录状态外,我们还可以在拦截器中进行一些其他的业务逻辑,在这里我们思考一个接口访问频率限制的问题。

需求:拦截某个接口,如果一段时间内(比如1秒钟)请求的次数超过一定的阈值(比如10次),则拒绝该请求。

通过使用redis记录该接口的访问次数,并配合定时任务刷新次数,可以实现该功能。具体实现代码如下:

public class RequestLimitInterceptor implements HandlerInterceptor {
  private static final Logger logger = LoggerFactory.getLogger(RequestLimitInterceptor.class);

  private RedisTemplate<String, Integer> redisTemplate;

  @Autowired
  public void setRedisTemplate(RedisTemplate<String, Integer> redisTemplate) {
      this.redisTemplate = redisTemplate;
  }

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      String requestUri = request.getRequestURI();
      String redisKey = "req_limit:" + requestUri;

      // 访问次数加1
      Integer count = redisTemplate.opsForValue().get(redisKey);
      if (count == null) {
          redisTemplate.opsForValue().set(redisKey, 1, 1, TimeUnit.SECONDS);
      } else {
          if (count > 10) {
              response.getWriter().write("请求过于频繁");
              logger.warn("请求过于频繁,URI={}", requestUri);
              return false;
          } else {
              redisTemplate.opsForValue().increment(redisKey, 1);
          }
      }
      return true;
  }

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

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

其中,我们使用了redis来记录该接口的访问次数,并设置了1秒钟的过期时间。当访问次数超过10次时,直接返回错误信息。

总结

上述就是实现自定义拦截器的完整攻略,包括引入依赖、编写拦截器、注册拦截器以及两个示例。需要注意的是,在实际项目中,我们还需要考虑一些其他的问题,比如拦截器的执行顺序、多个拦截器的综合作用等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot项目快速实现拦截器功能 - Python技术站

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

相关文章

  • 深入了解Springboot核心知识点之数据访问配置

    深入了解Spring Boot核心知识点之数据访问配置 Spring Boot是一个非常流行的Java框架,它提供了许多便利的功能,其中包括数据访问。在本文中,我们将深入了解Spring Boot的数据访问配置,包括如何配置数据源、如何使用JdbcTemplate和如何使用Spring Data JPA。 配置数据源 在Spring Boot中,我们可以使用…

    Java 2023年5月15日
    00
  • Java中对象的序列化详解及实例

    Java中对象的序列化详解及实例攻略 什么是序列化 序列化是将对象转换为字节序列的过程,以便将其存储到文件或内存缓冲区中,也可以通过网络传输到另一个计算机中。反序列化则是从字节序列中重构对象的过程。 在Java中,序列化是通过实现Serializable接口来实现的。该接口中没有方法,只是用来指示该类是可序列化的。 序列化的作用 序列化在实际开发中非常有用。…

    Java 2023年5月26日
    00
  • 分析mybatis运行原理

    下面我会为你详细讲解“分析MyBatis运行原理”的攻略。 MyBatis的概述 MyBatis是一款开源的持久层框架,它的主要作用就是帮助开发人员将数据库中的数据映射到Java对象中。 MyBatis在执行时,首先读取配置文件(mybatis-config.xml),通过配置文件解析器解析配置信息,然后创建SqlSessionFactory对象,创建Sql…

    Java 2023年5月20日
    00
  • Java ArrayList中存放引用数据类型的方式

    Java的ArrayList是一种动态数组类型,它可以存储引用数据类型,即存储对象的引用。下面是Java ArrayList存放引用数据类型的方式的完整攻略。 1. 创建一个ArrayList 使用Java中的ArrayList类来创建一个ArrayList,代码如下: ArrayList<Object> arrayList = new Arra…

    Java 2023年5月26日
    00
  • IDEA 2019.2.2配置Maven3.6.2打开Maven项目出现 Unable to import Maven project的问题

    下面是针对 “IDEA 2019.2.2配置Maven3.6.2打开Maven项目出现 Unable to import Maven project的问题”的攻略: 问题背景 在使用 IntelliJ IDEA 2019.2.2 配置 Maven 3.6.2 并打开 Maven 项目时,存在无法导入 Maven 项目的问题。 解决方案 第一步:确认 Mave…

    Java 2023年5月20日
    00
  • SpringMVC+Shiro的基本使用及功能介绍

    SpringMVC+Shiro的基本使用及功能介绍 什么是Shiro Shiro是一个强大且易于使用的Java安全框架,它提供了身份验证、授权、加密、会话管理等功能,可以帮助我们快速构建安全的Web应用程序。 SpringMVC集成Shiro SpringMVC集成Shiro可以帮助我们快速构建安全的Web应用程序。以下是SpringMVC集成Shiro的基…

    Java 2023年5月17日
    00
  • 使用java实现日志工具类分享

    下面就为大家详细讲解使用Java实现日志工具类的攻略。实现日志工具类是为了方便我们进行程序的调试和排错,让我们可以更好地了解程序执行过程中的各种信息和异常情况。下面我们来逐步实现这个日志工具类: 1. 思路分析 我们需要实现的日志工具类需要具备以下基本功能: 设置日志级别:可以设置不同的日志级别,包括 debug、info、warning、error、fat…

    Java 2023年5月19日
    00
  • SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    下面我将详细讲解“SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)”的完整攻略。 简介 在Java web开发中,SpringBoot和SpringSecurity组合使用,是非常常见的安全框架,可以很好地保护我们的网站不被非法入侵。但是如果我们使用了Ajax技术来进行登录,就需要对SpringSecurity的登录认证进行…

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