网关过滤器Filter

开课吧樵夫2021-12-22 16:48

  在讲解网关过滤器之前,首先我们要清楚什么是过滤器。过滤器就是允许以某种方式修改传入的HTTP请求或返回的HTTP响应。而过滤器作用域则是某些特定路由。过滤器允许以某种方式修改传入的HTTP请求或返回的HTTP响应。Filter根据其作用范围的不同,分为两种:局部过滤器与全局过滤器。

  局部过滤器:应用于单个路由策略上,其功能仅对路由断言为true的请求起作用。

  全局过滤器:应用于所有路由策略上,其功能就像前面的配置文件中设置的默认 Filter。

  首先定义一个showinfo-9000工程,仅导入spring-boot-web-starter依赖。

<?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">
    <parent>
        <artifactId>familycloud-alibaba</artifactId>
        <groupId>com.familycloud-alibaba</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

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

  定义处理器

package com.javafamily.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/info")
public class PetsController {
    // 暂时未定义任何方法
}

  复制gateway-config-9000工程,重命名为gateway-filter-config-9000并将配置文件中原来设置的路由策略全部删除。

  复制gateway-api-9001工程,重命名为gateway-filter-api-9001并将配置文件中原来设置的路由策略全部删除。

  AddRequestHeader过滤工厂

  该过滤器工厂会对匹配上的请求添加指定的header。

  配置式,修改配置文件:

server:
  port: 9000
spring:
  cloud:
    gateway:
      routes:
        - id: addRequestHeader_filter
          uri: http://localhost:8080
          predicates:
            - Path=/
          filters:
            - AddRequestHeader=X-Request-red, blue 123456789101112

  配置式:修改showinfo工程处理器,在处理器中添加如下处理器方法:

package com.javafamily.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/info")
public class PetsController {
    @RequestMapping("header")
    public String headerHandler(HttpServletRequest request) {
        String header = request.getHeader("x-Request-red");
        return "x-Request-red:" + header;
    }
}

  API式

  直接修改路由方法。

@Bean
public RouteLocator someRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes().route(ps -> ps.path("/").filters(fs -> fs.addRequestHeader("X-Request-red", "blue")).uri("http://localhost:8080").id("addRequestHeader_filter")).build();
}

  扩展了解过滤器工厂

  该过滤器工厂会对匹配上的请求添加指定的请求参数。

  配置式,修改配置文件

- id: addRequestParameter_filter 
  uri: http://localhost:8080 
  predicates: 
    - Path=/ 
  filters: 
    - AddRequestParameter=color, blue

  配置式,修改showinfo工程处理器,在处理器中添加如下处理器方法:

网关过滤器Filter

  API式

  直接修改路由方法。

网关过滤器Filter

  AddResponseHeader过滤工厂

  该过滤器工厂会给从网关返回的响应添加上指定的header。

  配置式,修改配置文件: