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动态加载数据库驱动,并提供两条示例说明。 什么是动态加载数据库驱动? Java中,使用JDBC连接数据库需要用到相应的数据库驱动,而加载数据库驱动是连接数据库的第一个必要步骤。传统的方式是使用Class.for…

    Java 2023年6月16日
    00
  • springmvc数据的封装过程详解

    了解了你的要求,下面我就来详细讲解“springmvc数据的封装过程详解”的完整攻略。 1. 数据封装的基本概念 在SpringMVC框架中,所有的请求操作都是通过Java对象来完成的,这就要求客户端提交的数据需要被服务端封装到Java对象中,然后才能进行数据的操作。 在数据封装的过程中,SpringMVC框架使用了数据绑定的方式来完成,即将客户端提交的数据…

    Java 2023年5月16日
    00
  • 监控微信小程序中的慢HTTP请求过程详解

    下面我来详细讲解“监控微信小程序中的慢HTTP请求过程详解”的完整攻略。 相关概念 在开始讲解之前,先介绍一些相关的概念: HTTP请求时间 表示从发出HTTP请求到收到响应所经过的时间。 DNS解析时间 表示从发出HTTP请求到获得目标服务器的IP地址所需的时间。 TCP连接时间 表示从发出HTTP请求到与目标服务器建立TCP连接所需的时间。 SSL/TL…

    Java 2023年5月23日
    00
  • 利用Java实体bean对象批量数据传输处理方案小结

    下面是详细讲解“利用Java实体bean对象批量数据传输处理方案小结”的完整攻略: 一、背景 在Java Web开发中,实体bean对象通常被用于封装表单数据、请求参数等信息,通过实体bean对象可以方便地进行数据传输和处理。在处理大量数据时,使用Java实体bean对象批量传输可以提高系统性能,缩短数据处理时间,同时也可以避免一些重复工作,提高开发效率。 …

    Java 2023年5月26日
    00
  • Spring JdbcTemplate执行数据库操作详解

    Spring JdbcTemplate执行数据库操作详解 什么是Spring JdbcTemplate? Spring JdbcTemplate是Spring框架提供的一个用于简化数据库访问和操作的工具类,它可以轻松地完成基础数据操作,如增删改查等。 Spring JdbcTemplate的主要特点包括: 简化的JDBC操作; 与Spring的事务管理集成;…

    Java 2023年6月2日
    00
  • Spring Security 安全框架应用原理解析

    Spring Security 安全框架应用原理解析 什么是 Spring Security? Spring Security 是一个基于 Spring 框架的安全框架,它可以为 Spring 应用程序提供全面的安全性解决方案,包括身份验证、授权、攻击防范等功能,保护应用程序的安全性。 Spring Security 的核心概念 1. 身份验证 Spring…

    Java 2023年5月20日
    00
  • 浅析JAVA中过滤器、监听器、拦截器的区别

    下面开始详细讲解“浅析JAVA中过滤器、监听器、拦截器的区别”的完整攻略。 概述 在Java Web开发中,过滤器、监听器、拦截器都是常用的三种组件,它们的作用都是在服务器接收请求和响应之间加入某种特性。虽然它们的功能有些相似,但它们的实现和应用场景又有所不同。 过滤器(Filter) 过滤器是在请求链中,对请求和响应进行预处理和后处理的组件。过滤器可以拦截…

    Java 2023年5月20日
    00
  • 使用JSP制作一个超简单的网页计算器的实例分享

    制作一个使用JSP制作一个超简单的网页计算器的实例方法如下: 第一步:新建一个JSP页面 首先,打开一个文本编辑器或者IDE,创建一个新文件,将文件的扩展名设置为 .jsp 即可。例如,我们新建一个 calculate.jsp 文件。 第二步:编写HTML代码 接下来,在新建的 calculate.jsp 文件中编写HTML代码,实现表单输入框和计算按钮。H…

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