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日

相关文章

  • java读取XML文件的四种方法总结(必看篇)

    下面是针对“java读取XML文件的四种方法总结(必看篇)”这篇攻略的详细讲解。 提供四种方法 该攻略提供了使用Java读取XML文件的四种方法,分别是: 使用SAX方式解析XML文件 使用DOM方式解析XML文件 使用JDOM方式解析XML文件 使用XMLBeans方式解析XML文件 对于每种方法,攻略都提供了详细的介绍和示例代码,并且针对各种场景,推荐了…

    Java 2023年5月20日
    00
  • Spring Security实现添加图片验证功能

    标题: Spring Security实现添加图片验证功能 正文:Spring Security是一个基于Spring框架的强大的安全框架,提供了身份验证和授权功能。其中,图片验证功能可以帮助我们增强安全性,防止恶意攻击和非法登录。以下是实现添加图片验证功能的完整攻略。 第一步:添加依赖 在项目的pom.xml文件中添加以下依赖: <dependenc…

    Java 2023年6月3日
    00
  • CAS操作的实现原理是什么?

    CAS(Compare And Swap)是一种并发控制机制,用于保证多线程并发修改时的数据一致性。它主要包括三个操作数:内存地址V、旧的预期值A和新的值B。当且仅当内存地址V的值和预期值A相同时,才把新的值B赋值给内存地址V,否则就什么都不做。下面就来详细讲解一下CAS操作的实现原理: CAS操作的实现原理 在计算机能够完成CAS操作的原理中,有两个非常重…

    Java 2023年5月10日
    00
  • uniapp开发打包多端应用完整方法指南

    我来为你详细讲解“uniapp开发打包多端应用完整方法指南”的完整攻略。 uniapp开发打包多端应用完整方法指南 1. uniapp简介 uniapp是一个基于Vue.js框架的开发多端应用的解决方案。它支持编写一份代码可以同时运行在H5、小程序、App各个端。同时,uniapp提供了许多针对不同端的API和优化策略,使得开发跨端应用变得更加简单高效。 2…

    Java 2023年5月23日
    00
  • 配置Web应用环境实现JSP留言簿

    下面给出配置Web应用环境实现JSP留言簿的完整攻略。 环境准备 在进行Web应用环境配置之前,需要先准备好以下环境: 安装Java开发环境(JDK) 安装Tomcat服务器 安装一个Java IDE(Eclipse、IntelliJ等) 创建Web应用项目 首先,需要在Java IDE中创建一个Web应用项目。以Eclipse为例,创建步骤如下: 打开Ec…

    Java 2023年6月2日
    00
  • 比较Ajax的三种实现及JSON解析

    实现Ajax的方式有很多,常用的有XMLHttpRequest、Fetch API和Axios。这里将详细讲解这三种实现方式以及相关的JSON解析。 XMLHttpRequest实现Ajax XMLHttpRequest是原生Ajax最常用的实现方式。具体的实现步骤如下: 创建XMLHttpRequest对象 javascript const xhr = n…

    Java 2023年5月26日
    00
  • Spring Framework常用面试题及答案汇总

    Spring Framework常用面试题及答案汇总 Spring Framework是Java开发中最常用的框架之一,因此在面试中也经常会被问到相关的问题。下面将总结一些常见的Spring Framework面试题及答案,供大家参考。 1. 什么是Spring Framework? Spring Framework是一个开源的全栈(full-stack)J…

    Java 2023年5月19日
    00
  • SpringBoot 如何实现异步编程

    Spring Boot提供了多种方式来实现异步编程,包括使用异步方法、使用异步任务、使用响应式编程等。在本攻略中,我们将介绍Spring Boot如何实现异步编程,并提供两个示例来说明其用法。 以下是两个示例,介绍Spring Boot实现异步编程的用法: 示例一:使用异步方法 Spring Boot提供了@Async注解来实现异步方法调用。以下是一个示例,…

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