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日

相关文章

  • boot-admin整合Quartz实现动态管理定时任务

    淄博烧烤爆红出了圈,当你坐在八大局的烧烤摊,面前是火炉、烤串、小饼和蘸料,音乐响起,啤酒倒满,烧烤灵魂的party即将开场的时候,你系统中的Scheduler(调试器),也自动根据设定的Trigger(触发器),从容优雅的启动了一系列的Job(后台定时任务)。工作一切早有安排,又何须费心劳神呢?因为boot-admin早已将Quartz这块肉串在了烤签上!项…

    Java 2023年4月27日
    00
  • java 服务器接口快速开发之servlet详细教程

    下面是“java 服务器接口快速开发之servlet详细教程”的完整攻略: 1. 什么是 Servlet Servlet 是一个在 Web 服务器上运行的 Java 类,主要用于接收和响应来自 Web 客户端的请求。根据 Servlet 规范,我们需要继承 HttpServlet 类来创建一个 Servlet,并在 web.xml 文件中进行配置。 2. s…

    Java 2023年5月19日
    00
  • js将键值对字符串转为json字符串的方法

    将键值对字符串转为JSON字符串的方法,可以使用JSON.parse()函数来实现。下面给出详细的攻略。 1. 确认键值对字符串的格式 在转换之前,需要确保键值对字符串的格式正确。格式应该是键值对之间使用逗号分隔,键与值之间使用冒号分隔,整个字符串包裹在一对花括号内。 例如,以下的字符串是合法的键值对字符串: {"name": &quot…

    Java 2023年5月26日
    00
  • Java之Jackson使用案例详解

    Java之Jackson使用案例详解 Jackson是Java中最流行的JSON序列化和反序列化库之一,它提供了轻量级快速、灵活的JSON处理方式。本文将详细讲解在Java中如何使用Jackson进行JSON序列化和反序列化。内容如下: 简介 在Java中使用Jackson进行JSON处理时,可以使用以下依赖: <!– Jackson核心模块 –&…

    Java 2023年5月26日
    00
  • Spring Native打包本地镜像的操作方法(无需通过Graal的maven插件buildtools)

    Spring Native打包本地镜像的操作方法 简介 Spring Native是Spring团队推出的一款可以将Java代码编译成本地可执行二进制文件的工具,在性能、启动速度等方面拥有很大的优势。本文主要介绍如何使用Spring Native将Java应用打包成本地镜像。 环境准备 在开始之前,需要确保以下工具已经安装好并配置: Docker Java …

    Java 2023年6月2日
    00
  • Spring Boot之内嵌tomcat版本升级操作示例

    下面我将详细讲解“Spring Boot之内嵌tomcat版本升级操作示例”的完整攻略。该攻略包含以下步骤: 1. 查看内嵌Tomcat版本 我们首先需要查看当前Spring Boot项目内嵌的Tomcat版本。在pom.xml文件中,可以找到以下代码: <dependency> <groupId>org.springframewor…

    Java 2023年5月19日
    00
  • Spring Data JPA实现排序与分页查询超详细流程讲解

    下面我来详细讲解一下“Spring Data JPA实现排序与分页查询超详细流程讲解”的完整攻略。本教程共包含以下五个步骤: 引入依赖 在pom.xml文件中加入以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>…

    Java 2023年6月2日
    00
  • java算法Leecode刷题统计有序矩阵中的负数

    Java算法Leetcode刷题是大多数Java程序员在提高自己的算法能力时所选择的途径之一。其中,《有序矩阵中的负数》是一道常见的算法题目。下面我将给出一份完整攻略,以便Java程序员能够更好地掌握这道题目。 题目描述 给定一个m*n的矩阵grid,其中每行和每列均已按非递增顺序排好序,请你统计并返回grid中 负数 的个数。 解题思路 因为矩阵已按照非递…

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