自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于Spring Boot給所有Controller接口添加統(tǒng)一前綴的五種方式

開發(fā) 前端
在Spring應(yīng)用程序中,負(fù)責(zé)處理Web請(qǐng)求的主要組件是DispatcherServlet。通過(guò)自定義這個(gè)組件,我們可以相當(dāng)程度地控制請(qǐng)求的路由方式。

環(huán)境:Spring Boot3.2.5

1. 簡(jiǎn)介

在Spring Boot應(yīng)用程序中,每個(gè)控制器都可以有自己的URL映射。這使得單個(gè)應(yīng)用程序能夠在多個(gè)位置提供Web接口。例如,我們可以將API接口分組為邏輯分組,如內(nèi)部和外部。

然而,有時(shí)我們可能希望將所有接口置于一個(gè)共同的前綴之下。在本篇文章中,我將深入探討為所有Spring Boot Controller使用共同前綴的不同方法。

2. 基于Servlet上下文

在Spring應(yīng)用程序中,負(fù)責(zé)處理Web請(qǐng)求的主要組件是DispatcherServlet。通過(guò)自定義這個(gè)組件,我們可以相當(dāng)程度地控制請(qǐng)求的路由方式。

接下來(lái)先來(lái)看看兩種自定義DispatcherServlet的方法,這樣我們的所有應(yīng)用程序端點(diǎn)都將可以在一個(gè)共同的URL前綴下訪問。

2.1 配置DispatcherServlet Bean

@Configuration
public class DispatcherServletCustomConfiguration {


  @Bean
  public DispatcherServlet dispatcherServlet() {
    return new DispatcherServlet() ;
  }
  @Bean
  public ServletRegistrationBean dispatcherServletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(
      dispatcherServlet(), "/api/") ;
    registration.setName("dispatcherServlet") ;
    return registration ;
  }
}

在這里,我們創(chuàng)建了一個(gè)封裝 DispatcherServlet Bean 的 ServletRegistrationBean。 設(shè)置了該Servlet的訪問前綴路徑為:/api/。這意味著我們的所有接口都必須通過(guò)該基礎(chǔ) URL 前綴進(jìn)行訪問。

2.2 基于配置屬性

我們也可以通過(guò)使用應(yīng)用程序?qū)傩詠?lái)達(dá)到同樣的效果。在 Spring Boot 2.x 之后的版本中,我們可以在 application.yml文件中添加以下內(nèi)容:

server:
  servlet:
    contextPath: /api

但在之前的版本則需要通過(guò)如下方式配置

server:
  contextPath: /api

在2.1中我們通過(guò)編程的方式設(shè)置了統(tǒng)一的前綴,其實(shí)我們還可以通過(guò)如下屬性配置

spring:
  mvc:
    servlet:
      path: /api

這種方式通過(guò)是給DispatcherServlet配置路徑訪問前綴。

基于Servlet上下文方式的優(yōu)缺點(diǎn):

上面介紹的兩種方法的主要優(yōu)點(diǎn)也是它們的主要缺點(diǎn):它們會(huì)影響應(yīng)用程序中的每個(gè)接口。對(duì)于一些應(yīng)用程序來(lái)說(shuō),這可能完全沒問題。然而,一些應(yīng)用程序可能需要使用標(biāo)準(zhǔn)的端點(diǎn)映射來(lái)與第三方服務(wù)進(jìn)行交互——例如OAuth交換。在這些情況下,這樣的全局解決方案可能并不合適。

3. 基于注解

為 Spring 應(yīng)用程序中的所有控制器添加前綴的另一種方法是使用注解。下面,我將介紹兩種不同的方法。

3.1 使用SpEL

使用 Spring Expression Language (SpEL) 和標(biāo)準(zhǔn) @RequestMapping 注解。使用這種方法,我們只需在每個(gè)控制器中添加一個(gè)需要前綴的屬性,如下示例:

@Controller
@RequestMapping(path = "${pack.app.apiPrefix}/users")
public class UserController {
}

配置文件中我們只需要配置上pack.app.apiPrefix屬性即可。

3.2 自定義注解

這種方式需要我們自定義注解,這完全可以仿照@GetMapping、@PostMapping等這類注解來(lái)實(shí)現(xiàn)即可,如下示例:

@RequestMapping(value = "/api/")
public @interface PackMapping {
}
// 使用
@RestController
@PackMapping
public class SomeController {
  @RequestMapping("/users")
  public String getAll(){
    return "..." ;
  }
}

基于注解的優(yōu)缺點(diǎn):

這兩種方法解決了前一種方法的主要問題:它們都能對(duì)哪些控制器獲得前綴進(jìn)行細(xì)粒度控制。我們可以只對(duì)特定控制器應(yīng)用注解,而不是影響應(yīng)用程序中的所有接口。

4. 服務(wù)端轉(zhuǎn)發(fā)

使用服務(wù)器端轉(zhuǎn)發(fā)。與重定向不同,轉(zhuǎn)發(fā)不涉及向客戶端發(fā)送響應(yīng)。這意味著我們的應(yīng)用程序可以在接口之間傳遞請(qǐng)求,而不會(huì)影響客戶端。

下面編寫一個(gè)簡(jiǎn)單的控制器,其中包含兩個(gè)接口:

@RestController
public class EndpointController {
  @GetMapping("/endpoint1")
  public String endpoint1() {
      return "Hello from endpoint 1";
  }
  @GetMapping("/endpoint2")
  public String endpoint2() {
      return "Hello from endpoint 2";
  }
}

接下來(lái),我們根據(jù)所需的前綴創(chuàng)建一個(gè)新控制器:

@Controller
@RequestMapping("/api/endpoint")
public class ApiPrefixController {
  @GetMapping
  public ModelAndView route(ModelMap model, HttpServletRequest request) {
    String action = request.getHeader("X-ACTION");
    return switch (action) {
      case null -> new ModelAndView("forward:/error") ;
      case "xxx" -> new ModelAndView("forward:/endpoint1", model) ;
      case "zzz" -> new ModelAndView("forward:/endpoint2", model) ;
      default -> new ModelAndView("forward:/home") ;
    } ;
  }
}

這個(gè)控制器有一個(gè)接口,它充當(dāng)路由器。將原始請(qǐng)求轉(zhuǎn)發(fā)到我們的另外兩個(gè)端點(diǎn)之一。

5. Nginx反向代理

通過(guò)Nginx配置反向代理來(lái)管理統(tǒng)一的前綴

server {
  listen              80;
  server_name         default;


  location /api/ {
    proxy_set_header Host $host ;
    proxy_set_header  X-Real-IP        $remote_addr ;
    proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for ;
    proxy_set_header X-NginX-Proxy true ;


    rewrite ^/api/(.*)$ /$1 break ;
    proxy_pass http://www.pack.com ;
  }
}

這種方式最為簡(jiǎn)單,不對(duì)我們的業(yè)務(wù)代碼做任何的調(diào)整。

責(zé)任編輯:武曉燕 來(lái)源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2025-02-12 08:47:07

SpringAPI接口

2022-08-18 09:38:02

Spring跨域

2024-08-01 09:10:03

2025-02-03 09:00:00

API接口性能

2011-02-28 13:51:30

Spring事物配置

2009-06-19 18:26:38

Spring事務(wù)配置

2011-11-25 10:25:27

SpringJava

2025-02-13 07:45:26

APISpringHTTP

2021-12-31 13:40:43

Spring Boot熱部署Java

2021-04-30 07:34:01

Spring BootController項(xiàng)目

2024-10-18 08:00:00

SpringBoot框架開發(fā)

2011-06-03 11:53:06

Spring接口

2023-09-08 08:23:29

Servlet程序MVC

2024-10-12 08:18:21

Spring接口組件

2022-03-25 06:23:36

httpcookie服務(wù)端

2025-01-08 09:55:37

Spring接口數(shù)據(jù)庫(kù)

2024-09-13 08:22:28

2020-09-23 16:31:38

C++C++11啟動(dòng)線程

2025-01-08 09:35:55

Spring性能監(jiān)控

2024-09-05 09:38:55

SpringActuator應(yīng)用程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)