SpringBoot拦截器使用精讲

Spring Boot拦截器使用精讲

拦截器是一种常用的技术,可以在请求到达控制器之前或之后执行一些操作。在Spring Boot中,可以使用拦截器来实现一些常见的功能,例如身份验证、日志记录、性能监控等。本文将深入讲解Spring Boot拦截器的使用,包括拦截器的定义、注册和使用,以及两个示例。

定义拦截器

在Spring Boot中,可以通过实现HandlerInterceptor接口来定义拦截器。HandlerInterceptor接口包含三个方法,分别是preHandle()、postHandle()和afterCompletion()。以下是一个示例:

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求到达控制器之前执行
        return true; // 返回true表示继续执行,返回false表示中断执行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在请求到达控制器之后,视图渲染之前执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在视图渲染之后执行
    }
}

在上面的示例中,我们定义了一个名为MyInterceptor的拦截器,实现了HandlerInterceptor接口,并重写了preHandle()、postHandle()和afterCompletion()方法。在preHandle()方法中,我们可以执行一些操作,例如身份验证、日志记录等。在postHandle()方法中,我们可以修改ModelAndView对象,例如添加一些额外的数据。在afterCompletion()方法中,我们可以执行一些清理操作,例如关闭数据库连接等。

注册拦截器

在Spring Boot中,可以通过实现WebMvcConfigurer接口来注册拦截器。以下是一个示例:

@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

在上面的示例中,我们定义了一个名为MyWebMvcConfigurer的配置类,实现了WebMvcConfigurer接口,并重写了addInterceptors()方法。在addInterceptors()方法中,我们通过registry对象注册了一个MyInterceptor拦截器,并指定了拦截所有请求("/**"),但排除了/login请求。

示例一:身份验证拦截器

以下是一个示例,演示如何使用拦截器实现身份验证:

  1. 创建一个名为AuthInterceptor的拦截器:
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        if (session.getAttribute("user") == null) {
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }
}

在上面的示例中,我们创建了一个名为AuthInterceptor的拦截器,实现了HandlerInterceptor接口,并重写了preHandle()方法。在preHandle()方法中,我们获取HttpSession对象,检查是否存在名为"user"的属性。如果不存在,则重定向到/login页面,并返回false,中断执行。如果存在,则返回true,继续执行。

  1. 在MyWebMvcConfigurer类中注册AuthInterceptor拦截器:
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

在上面的示例中,我们在addInterceptors()方法中注册了AuthInterceptor拦截器,并指定了拦截所有请求("/**"),但排除了/login请求。

  1. 创建一个/login请求处理方法:
@Controller
public class LoginController {
    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @PostMapping("/login")
    public String doLogin(@RequestParam String username, @RequestParam String password, HttpSession session) {
        if ("admin".equals(username) && "admin".equals(password)) {
            session.setAttribute("user", username);
            return "redirect:/";
        } else {
            return "login";
        }
    }
}

在上面的示例中,我们创建了一个名为LoginController的控制器,使用@GetMapping注解定义了一个GET请求处理方法,使用@PostMapping注解定义了一个POST请求处理方法。在doLogin()方法中,我们检查用户名和密码是否正确。如果正确,则将用户名保存到HttpSession对象中,并重定向到/页面。如果不正确,则返回login页面。

  1. 创建一个/login页面:
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="post" action="/login">
        <label>Username:</label>
        <input type="text" name="username"><br>
        <label>Password:</label>
        <input type="password" name="password"><br>
        <input type="submit" value="Login">
    </form>
</body>
</html>

在上面的示例中,我们创建了一个名为login的HTML页面,包含一个表单,用于输入用户名和密码。

  1. 启动应用程序,并访问http://localhost:8080/,可以看到重定向到/login页面。输入正确的用户名和密码,可以看到重定向到/页面。输入错误的用户名和密码,可以看到仍然停留在login页面。

示例二:性能监控拦截器

以下是另一个示例,演示如何使用拦截器实现性能监控:

  1. 创建一个名为PerformanceInterceptor的拦截器:
public class PerformanceInterceptor implements HandlerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(PerformanceInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        request.setAttribute("startTime", System.currentTimeMillis());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long startTime = (long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        long executeTime = endTime - startTime;
        logger.info("{} executed in {} ms", request.getRequestURI(), executeTime);
    }
}

在上面的示例中,我们创建了一个名为PerformanceInterceptor的拦截器,实现了HandlerInterceptor接口,并重写了preHandle()和afterCompletion()方法。在preHandle()方法中,我们记录了请求开始的时间。在afterCompletion()方法中,我们计算了请求执行的时间,并使用日志记录器记录了请求的URI和执行时间。

  1. 在MyWebMvcConfigurer类中注册PerformanceInterceptor拦截器:
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new PerformanceInterceptor())
                .addPathPatterns("/**");
    }
}

在上面的示例中,我们在addInterceptors()方法中注册了PerformanceInterceptor拦截器,并指定了拦截所有请求("/**")。

  1. 启动应用程序,并访问http://localhost:8080/,可以在日志中看到请求的URI和执行时间。

总结

在本文中,我们深入讲解了Spring Boot拦截器的使用,包括拦截器的定义、注册和使用,以及两个示例。这些技巧可以帮助您实现一些常见的功能,例如身份验证、日志记录、性能监控等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot拦截器使用精讲 - Python技术站

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

相关文章

  • Java异步编程的作用是什么?

    Java异步编程是指在处理高并发、大量请求的情况下,通过异步方式来实现更高的效率和性能。异步编程主要是通过异步操作来实现,异步操作是指当一个请求发出后,不必等待该请求完全响应后再去处理下一个请求,而是可以立即处理下一个请求,并在响应返回后再对其进行处理。 Java异步编程利用了多线程技术,将一个请求分为多个阶段,每个阶段使用一个线程单独处理,并在所有阶段都完…

    Java 2023年5月11日
    00
  • Springboot apollo原理及使用方法详解

    SpringBootApollo原理及使用方法详解 1. 什么是SpringBootApollo SpringBootApollo是阿里巴巴开源的一款配置中心,它基于Apollo实现,并提供了SpringBoot的集成支持。使用SpringBootApollo,我们可以轻松地将Apollo配置中心集成到SpringBoot应用程序中,实现动态配置管理。 2.…

    Java 2023年5月15日
    00
  • RSA加密算法java简单实现方法(必看)

    当然,下面我将为您详细讲解“RSA加密算法java简单实现方法(必看)”的完整攻略。 RSA加密算法java简单实现方法(必看) 简介 RSA加密算法是一种非对称加密算法,广泛运用于网络通信与安全领域。RSA算法通常需要进行非常复杂的数学运算,但我们完全可以利用Java的BigInteger类来实现RSA算法。 实现步骤 生成公私钥对 首先,我们需要通过Ja…

    Java 2023年5月19日
    00
  • 一个简单的ajax上传进度显示示例

    下面我来详细讲解一下“一个简单的ajax上传进度显示示例”的完整攻略。 一、前置知识 在开始之前,你需要了解一些基础知识: AJAX:即 Asynchronous JavaScript And XML,即异步的 JavaScript 和 XML 技术,可以在不刷新页面的情况下,向服务器发送请求并接收响应。 XMLHTTPRequest 对象:即 XMLHtt…

    Java 2023年6月16日
    00
  • 初学者,Spring快速入门

    以下是“初学者,Spring快速入门”的完整攻略: 目录 简介 准备工作 Spring快速入门 示例说明 总结 简介 Spring是一款流行的Java开发框架,它可以帮助开发者更加轻松地构建传统的Java应用程序和企业级应用程序。本攻略将帮助初学者快速入门Spring框架。 准备工作 在开始学习Spring框架之前,有一些基本的前置条件需要准备: JDK(J…

    Java 2023年5月19日
    00
  • jsp获取action传来的session和session清空以及判断

    获取Action传来的session和清空session是JSP页面常用的操作之一。本文将介绍如何在JSP页面中获取Action传递过来的session和如何清空session,同时提供代码示例进行说明。 获取Action传来的session 获取Action传递过来的session需要使用jsp:useBean标签和sessionScope对象。jsp:u…

    Java 2023年6月15日
    00
  • Java实现ZooKeeper的zNode监控

    当我们使用ZooKeeper作为分布式协调框架时,监视zNode的变化是很常见的任务,因为zNode的变化往往意味着某些与服务相关的状态变化。本文将详细讲解如何使用Java实现ZooKeeper的zNode监视。 步骤一:导入ZooKeeper依赖 首先,在项目的pom.xml文件中添加以下ZooKeeper依赖: <dependency> &l…

    Java 2023年5月19日
    00
  • Java编程线程间通信与信号量代码示例

    下面我将为您详细讲解“Java编程线程间通信与信号量代码示例”的攻略。 1. 什么是线程间通信和信号量? 在多线程编程中,线程间通信和信号量都是非常重要的概念。线程间通信是指多个线程之间共享同一块数据,需要明确地进行协作才能保证数据的正确性和完整性。而信号量则是用来控制并发访问的一种方式,通过对资源的访问进行限制,保证多个线程能够有序、安全地访问共享的资源。…

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