Spring Boot 教程: 拦截器

2023-11-05

【注】本文译自: https://www.tutorialspoint.com/spring_boot/spring_boot_interceptor.htm
在这里插入图片描述
在以下两种情况下,可以在 Spring Boot 中使用拦截器来执行操作:

	* 发送请求到控制器之前
	* 发送响应到客户端之前

   譬如,可以使用拦截器在发送请求到控制器之前添加请求头,并在发送响应到客户端之前添加响应头。
   要用拦截器,你需要创建 @Component 类,并且要实现 HandlerInterceptor 接口。
    下面是使用拦截器要知道的三个方法:

	* preHandle() 方法:用于在发送请求到控制器之前执行操作。这个方法应当返回 true 以响应客户端。
	* postHandle() 方法:用于在发送响应到客户端之前执行操作。
	* afterCompletion() 方法: 用于在请求和响应完成之后执行操作。

   观察以下代码以加深理解:
@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      
      return true;
   }
   @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 exception) throws Exception {}
}
   还要通过 WebMvcConfigurerAdapter 用 InterceptorRegistry 注册这个拦截器:
@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
   @Autowired
   ProductServiceInterceptor productServiceInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(productServiceInterceptor);
   }
}
  Application Configuration 类文件把拦截器注册到 Interceptor Registry中,ProductServiceInterceptorAppConfig.java 文件如下:
package com.tutorialspoint.demo.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle
      (HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
      
      System.out.println("Pre Handle method is Calling");
      return true;
   }
   @Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response,
      Object handler, ModelAndView modelAndView) throws Exception {
      
      System.out.println("Post Handle method is Calling");
   }
   @Override
   public void afterCompletion
      (HttpServletRequest request, HttpServletResponse response, Object
      handler, Exception exception) throws Exception {
      
      System.out.println("Request and Response is completed");
   }
}
          Application Configuration 类文件把拦截器注册到 Interceptor Registry中,ProductServiceInterceptorAppConfig.java 文件如下:
package com.tutorialspoint.demo.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
   @Autowired
   ProductServiceInterceptor productServiceInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(productServiceInterceptor);
   }
}
  Controller 类文件 ProductServiceController.java 如下:
package com.tutorialspoint.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.tutorialspoint.demo.exception.ProductNotfoundException;
import com.tutorialspoint.demo.model.Product;

@RestController
public class ProductServiceController {
   private static Map<String, Product> productRepo = new HashMap<>();   
   static {      
      Product honey = new Product();
      honey.setId("1");
      honey.setName("Honey");
      productRepo.put(honey.getId(), honey);      
      Product almond = new Product();
      almond.setId("2");
      almond.setName("Almond");
      productRepo.put(almond.getId(), almond);      
   }
   @RequestMapping(value = "/products")
   public ResponseEntity<Object> getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}
  POJO 类文件 Product.java 如下:
package com.tutorialspoint.demo.model;

public class Product {
   private String id;
   private String name;

   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}
  主 Spring Boot 应用类文件 DemoApplication.java 如下所示:
package com.tutorialspoint.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);   
   }
}
  Maven build – pom.xml 文件在此:
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "
   http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>demo</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.8.RELEASE</version>
      <relativePath/>
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </properties>

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

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>
  Gradle Build build.gradle 文件在此:
buildscript {
   ext {
      springBootVersion = '1.5.8.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
dependencies {
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
  你可以使用下面的 Maven 或 Gradle 命令创建可执行的 JAR 文件,运行 Spring Boot 应用:
  对于 Maven,使用以下命令:
mvn clean install 
  在 “BUILD SUCCESS” 之后,你可以在 target 目录下找到 JAR 文件:
  对于 Gradle,使用以下命令:
gradle clean build
  在 “BUILD SUCCESSFUL” 之后,你可以在 build/libs 目录下找到 JAR 文件:
  可以使用以下命令运行 JAR 文件:
java –jar <JARFILE> 
  此时,应用已经在 Tomcat 8080 端口启动了,如下所示:

在这里插入图片描述
在 POSTMAN 应用中单击以下 URL,你可以看到下面的结果:
GET API: http://localhost:8080/products:
在这里插入图片描述
在控制台窗口,你可以看到加在拦截器中的 System.out.println 打印出来的结果,截屏如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 教程: 拦截器 的相关文章

  • Mysql最常用时间格式转化

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 1 Date转字符串 2 字符串转Date 3 上述转化的字符串格式有许多种 常见的几种如下 总结 前言 主要介绍了Mysql中最常用的两个时间格式转化函数
  • 最简单的打印数组的方式

    注意 输出数组 不用 System out println arr toString System out println arr 以上两种方法输出的是数组的地址 下面这种方法输出的才是数组的内容 System out println Ar
  • 数据库课程设计 医院管理系统 SQL

    文章目录 一 背景资料 需求分析 二 功能模块 三 功能设计说明书 要求详细描述各模块功能 给出模块结构图 SC图 四 数据库设计 1 概念模型 图 2 逻辑模型 五 建表以及sql语句 1 病人表 2 医生表 3 科室表 4 病房表 六
  • JDBC连接Mysql长时间无动作连接失效

    错误场景介绍 做的有一个项目使用JDBC手动创建Connection实现了一个简单的自定义数据库连接池 用来支持Canal解析数据库Binlog指定业务库的插入修改SQL来进行数据库分表备份 按照月份 操作 但是发现当一个一段时间 较长 没
  • 零基础ros基于arduino键盘控制小车(2)

    1上传下位机程序 上传成功后 打开窗口监视器 输入m 20 20来进行测试 e键来检测编码器的值 r键复原 调试的过程在这里便不废话了 2上传上位机程序 2 1 见网上大多数是输入以下指令来查看当前可用窗口 ls dev tty 我是直接打

随机推荐

  • Error 11 No resource identifier found for attribute 'textAlignment' in package 'android' 问题解决

    遇到这个问题是因为最近在做融云及时通讯 当导入moudle后 在编译就出现了这个问题 刚开始在百度上搜 提示要把target api level 改为19 改完之后还是报同样的错误 然后就认为不是这个地方的原因 在别的地方找了好久也没找到
  • 【图文详解】入职必备——SVN使用教程

    一 SVN基本操作 1 进入svnbucket官网 创建一个空项目 学习svn 2 创建好测试项目后 复制对应地址 3 右键点击 SVN 检出 4 粘贴 版本库URL 填写 检出至目录 最后点击 确定 5 完善 用户名 和 密码 同svnb
  • SpringBoot系列--自定义Starter

    提到Spring Boot时 很多人想到的是它的自动化装配特性 当我们项目需要Redis MongoDB时 只需要引入相应的 spring boot starter data redis spring boot starter data m
  • log库spdlog简介及使用

    spdlog是一个开源的 快速的 仅有头文件的C 11 日志库 code地址在 https github com gabime spdlog 目前最新的发布版本为0 14 0 它提供了向流 标准输出 文件 系统日志 调试器等目标输出日志的能
  • 程序员常用在线工具网址

    online tools 1 字符串长度计算 https www toolbaba cn d dev str count 2 在线sha加密工具 http tools jb51 net password sha encode 3 在线进制转
  • Opencv通过颜色区分电线

    Opencv检测不同颜色的电线是否接好 机器视觉检测物体要根据检测对象的特征找到最方便快捷的方法 最近做了一个靠颜色像素来区分电线的小项目 颜色区分是inRange方法 这个方法检测的是HSV彩色图像的范围 需要将图像转换为HSV图像 如图
  • 深入剖析Tomcat原理

    深入剖析Tomcat原理 一 Tomcat源码部署和运行 intellij IDEA 1 下载tomcat源码 以tomcat 8为例 链接 https tomcat apache org 2 源码部署到IDEA中 创建新的空工程 解压源码
  • vue可视化拖拽生成工具_推荐这几个数据大屏可视化开发工具

    前沿 最近有需求开始接触数据可视化的开发 前期调研和体验了国内几家比较大的数据可视化解决方案提供商 并对开发中会涉及到一些工具做了筛选 经常在社区看到有小伙伴反馈相关方面的需求 于是借此机会把我整理的一些工具分享出来 后期开发完成再针对整个
  • 华为OD机试真题-快递投放【2023.Q1】

    题目描述 有N个快递站点用字符串标识 某些站点之间有道路连接 每个站点有一些包裹要运输 每个站点间的包裹不重复 路上有检查站会导致部分货物无法通行 计算哪些货物无法正常投递 输入描述 1 第一行输入M N M个包裹N个道路信息 2 0 lt
  • C语言经典100例题(40)-- 将一个数组逆序输出

    目录 题目 问题分析 代码 测试结果 欢迎各位大佬 题目 将一个数组逆序输出 问题分析 第一种方法 直接从最后一个元素进行输出即可 倒着输出 第二种方法 将数组的第一个元素与最后一个元素交换 依次类推 然后正顺序输出 代码 第一种方法 in
  • Linux 网络协议栈开发(二)—— 二层桥转发基础

    做为网络设备 二层转发是最基本的功能 要想继续学习linux 内核协议栈 必须明白二层转发的流程 这篇文章举例讲一讲二层转发的流程 二层转发是根据报文的目的MAC直接进行转发 转发过程中不用对报文的头部做任何的修改 三层转发是根据报文的ip
  • 关于:selenium.common.exceptions.WebDriverException: Message: unknown error: cannot get automation exte

    太阳照常升起 脚本依旧还是昨天的脚本 为啥今天就报错了呢 先说明下哪里报错了 当我想要maximize window 时 报错 selenium common exceptions WebDriverException Message un
  • vscode开发java项目简单版

    VS Code 是一个轻量级的代码编辑器 它提供了丰富的扩展生态系统和内置的开发工具 可以支持多种语言和开发平台 Java 是一种流行的编程语言 可以用于开发各种类型的应用程序 下面是在VS Code 中开发Java 项目的基本步骤 安装J
  • java根据word模板生成文档(含文本替换和动态生成表格)

    开发功能需求 给定word模板 word模板中存在 XXX 格式的需要变量替换的一些词 包括直接可以被替换的词 需要循环获取 替换 格式处理的词 例如根据数据库存储内容循环生成表格 模板中还可能会有需要自动增行的表格 1 用到的依赖
  • 对话AI创作助手,它的回答,惊艳到我了。

    1 与AI创作助手的对话 ChatGPT是一个开源的Python库 可以用于构建基于GPT模型的聊天机器人 它使用开放式AI技术 可以适应大量的训练数据 并且可以自动学习用户的对话方式 以下是从测试角度聊一聊ChatGPT的内容 1 测试C
  • 【解决】默认库“msvcrtd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

    出处 http blog csdn net iesneaker article details 6524459 警告信息如下 1 gt LINK warning LNK4098 默认库 MSVCRT 与其他库的使用冲突 请使用 NODEFA
  • 使用Clang作为库 —— Clang AST

    Clang AST 1 介绍 2 检查AST 3 AST Context 4 AST节点 本文为译文 点击 此处查看原文 本文档温和地介绍了Clang AST的神秘之处 主要针对那些希望为Clang做贡献的开发人员 或者使用基于Clang
  • 【挨踢人物传】关东升:成功的路上很寂寞,贵在坚持(第20期)

    编者有话 本期的嘉宾关东升 近10年编写15本书 执着坚持 不管遇到什么挫折或者不顺利 都能够用最大的勇气 继续坚持下去 因为他知道 只有坚持下去 黎明前的曙光才会属于他 本期人物档案 个人信息 51CTO账号 tony guan 姓名 关
  • vue实现无限旋转效果

  • Spring Boot 教程: 拦截器

    注 本文译自 https www tutorialspoint com spring boot spring boot interceptor htm 在以下两种情况下 可以在 Spring Boot 中使用拦截器来执行操作 发送请求到控制