📜  Spring Boot-拦截器

📅  最后修改于: 2020-11-11 05:35:56             🧑  作者: Mango


您可以在以下情况下使用Spring Boot中的Interceptor来执行操作-

  • 在将请求发送到控制器之前

  • 在将响应发送给客户端之前

例如,您可以使用拦截器在将请求发送到控制器之前添加请求标头,并在将响应发送到客户端之前添加响应标头。

要使用拦截器,您需要创建支持它的@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 {}
}

您将必须使用WebMvcConfigurerAdapterInterceptorRegistry注册此Interceptor,如下所示-

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

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(productServiceInterceptor);
   }
}

在下面给出的示例中,我们将使用GET products API,该产品的输出如下-

下面给出了Interceptor类ProductServiceInterceptor.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类文件的代码– 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);
   }
}

控制器类文件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 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 getProduct() {
      return new ResponseEntity<>(productRepo.values(), HttpStatus.OK);
   }
}

下面给出了Product.java的POJO类的代码-

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构建的代码– pom.xml如下所示-



   
   4.0.0
   com.tutorialspoint
   demo
   0.0.1-SNAPSHOT
   jar
   demo
   Demo project for Spring Boot

   
      org.springframework.boot
      spring-boot-starter-parent
      1.5.8.RELEASE
       
   

   
      UTF-8
      UTF-8
      1.8
   

   
      
         org.springframework.boot
         spring-boot-starter-web
      

      
         org.springframework.boot
         spring-boot-starter-test
         test
      
   

   
      
         
            org.springframework.boot
            spring-boot-maven-plugin
         
      
   
   

这里显示了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')
}

您可以创建一个可执行的JAR文件,并使用以下Maven或Gradle命令运行Spring Boot应用程序。

对于Maven,使用如下所示的命令-

mvn clean install

在“ BUILD SUCCESS”之后,您可以在目标目录下找到JAR文件。

对于Gradle,请使用如下所示的命令-

gradle clean build

在“ BUILD SUCCESSFUL”之后,您可以在build / libs目录下找到JAR文件。

您可以使用以下命令运行JAR文件-

java –jar  

现在,应用程序已在Tomcat端口8080上启动,如下所示-

在Tomcat端口8080上启动应用程序

现在在POSTMAN应用程序中点击下面的URL,您可以看到输出,如下所示:

GET API: http:// localhost:8080 / products

POSTMAN应用程序获取API URL

在控制台窗口中,您可以看到Interceptor中添加的System.out.println语句,如下面的屏幕快照所示-

拦截器输出控制台窗口