Skip to content

删除路径前缀 StripPrefixGatewayFilterFactory

  • 如果通过网关代理的请求,需要删除路径前缀,可以使用 StripPrefixGatewayFilterFactory 过滤器
java
package cn.com.xuxiaowei.shield.gateway.filter.factory;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.cloud.gateway.filter.factory.StripPrefixGatewayFilterFactory;
import org.springframework.test.context.TestPropertySource;
import org.springframework.web.client.RestTemplate;

import java.util.Map;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.assertNotNull;

/**
 * @author xuxiaowei
 * @since 0.0.1
 * @see StripPrefixGatewayFilterFactory
 */
@Slf4j
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
// @formatter:off
@TestPropertySource(properties = {

		// 将 demo.localdev.me:* 的所有请求转发到 http://localhost:45678,并且删除路径的前1个前缀(使用 / 分割,默认为删除第一个)

        "spring.cloud.gateway.routes[0].id=demo",
        "spring.cloud.gateway.routes[0].uri=http://localhost:45678",
        "spring.cloud.gateway.routes[0].predicates[0]=Host=demo.localdev.me:*",
        "spring.cloud.gateway.routes[0].filters[0].name=StripPrefix",

		// 将 demo.localdev.me:* 的所有请求转发到 http://localhost:45678,并且删除路径的前2个前缀(使用 / 分割)

		"spring.cloud.gateway.routes[1].id=demo-1",
		"spring.cloud.gateway.routes[1].uri=http://localhost:45678",
		"spring.cloud.gateway.routes[1].predicates[0]=Host=demo-1.localdev.me:*",
		"spring.cloud.gateway.routes[1].filters[0].name=StripPrefix",
		"spring.cloud.gateway.routes[1].filters[0].args.parts=2",
})
// @formatter:on
class StripPrefixGatewayFilterFactoryTests {

    @LocalServerPort
    private int serverPort;

    @SneakyThrows
    @Test
    void apply() {

        // @formatter:off
		// 将 demo.localdev.me:* 的所有请求转发到 http://localhost:45678,并且删除路径的前缀(使用 / 分割,默认为删除第一个)
		// 将 http://demo.localdev.me:端口/任何字符串/header 转发到 http://localhost:45678/header
		// @formatter:on

        String url = String.format("http://demo.localdev.me:%s/%s/header", serverPort, UUID.randomUUID());

        log.info("url: {}", url);

        RestTemplate restTemplate = new RestTemplate();

        Map map = restTemplate.getForObject(url, Map.class);

        assertNotNull(map);
    }

    @SneakyThrows
    @Test
    void ua() {

        // @formatter:off
		// 将 demo.localdev.me:* 的所有请求转发到 http://localhost:45678,并且删除路径的前缀(使用 / 分割,默认为删除第一个)
		// 将 http://demo.localdev.me:端口/任何字符串/任何字符串/header 转发到 http://localhost:45678/header
		// @formatter:on

        // @formatter:off
		String url = String.format("http://demo-1.localdev.me:%s/%s/%s/header", serverPort, UUID.randomUUID(), UUID.randomUUID());
		// @formatter:on

        log.info("url: {}", url);

        RestTemplate restTemplate = new RestTemplate();

        Map map = restTemplate.getForObject(url, Map.class);

        assertNotNull(map);
    }

}