Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)

 

目录

服务网关Gateway_过滤器详解

服务网关Gateway_网关过滤器GatewayFilter

服务网关Gateway_自定义网关过滤器

服务网关Gateway_过滤器之全局过滤器

服务网关Gateway_网关的cors跨域配置


服务网关Gateway_过滤器详解

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第1张图片

微服务系统中的服务非常多。如果每个服务都自己做鉴权、限流、 日志输出,则非常不科学。所以,可以通过网关的过滤器来处理这 些工作。在用户访问各个服务前,应在网关层统一做好鉴权、限流 等工作。 

Filter的生命周期 

根据生命周期可以将Spring Cloud Gateway中的Filter分为"PRE"和"POST"两种。

PRE:代表在请求被路由之前执行该过滤器,此种过滤器可用来实现参数校验、权限校验、流量监 控、日志输出、协议转换等功能。

POST:代表在请求被路由到微服务之后执行该过滤器。此种过滤器可用来实现响应头的修改(如添加标准的HTTP Header )、收集统计信息和指标、将响应发送给客户端、输出日志、流量监控等功能。 

Filter分类 

根据作用范围,Filter可以分为以下两种。

1、GatewayFilter:网关过滤器,此种过滤器只应用在单个路由或者一个分组的路由上。

2、GlobalFilter:全局过滤器,此种过滤器会应用在所有的路由上。

实时效果反馈

1.下列不属于服务网关Gateway过滤器应用场景。

A 鉴权

B 限流

C 日志输出

D 服务注册发现 

服务网关Gateway_网关过滤器GatewayFilter

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第2张图片

 网关过滤器( GatewayFilter )允许以某种方式修改传入的HTTP请求, 或输出的HTTP响应。网关过滤器作用于特定路由。Spring Cloud Gateway内置了许多网关过滤器工厂来编写网关过滤器。

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第3张图片 

常用内置过滤器的使用 

配置文件中加入SetStatus过滤器

#过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
filters:
   - SetStatus=250 # 修改原始响应的状态码

启动测试

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第4张图片

实时效果反馈

1.服务网关Gateway为原始请求加入Header使用_____过滤器。

A AddRequestHeader

B AddRequestParameter

C SetPath

D Retry

2.服务网关Gateway为原始请求添加请求参数_____过滤器。

A AddRequestHeader

B AddRequestParameter

C SetPath

D Retry 

服务网关Gateway_自定义网关过滤器

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第5张图片

需求:通过过滤器,配置是否在控制台输出日志信息,以及是否记录日志。 

实现步骤:

1、类名必须叫做XxxGatewayFilterFactory,注入到Spring容器后使用时的名称就叫做Xxx。

2、创建一个静态内部类Config, 里面的属性为配置文件中配置的参数, - 过滤器名称=参数 1,参数2… 2、类必须继承 AbstractGatewayFilterFactory,让父类帮实现配置参数的处理。

3、重写shortcutFieldOrder()方法,返回List参数列表为Config中属性集合 return Arrays.asList(“参数1”,参数2…)

4、无参构造方法中super(Config.class)

5、编写过滤逻辑 public GatewayFilter apply(Config config)

在配置文件中,添加一个Log的过滤器配置 

# 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
filters:  
   # 控制日志是否开启
   - Log=true

自定义一个过滤器工厂,实现里面的方法

/**
* 自定义局部过滤器
*/
@Component
public class LogGatewayFilterFactory extends
AbstractGatewayFilterFactory {
    public LogGatewayFilterFactory(){
        super(Config.class);
   }
    @Override
    public List shortcutFieldOrder(){
        return Arrays.asList("consoleLog");
   }
    @Override
    public GatewayFilter apply(Config config) {
        return ((exchange, chain) -> {
            if (config.consoleLog) {
                System.out.println("console日志已开启...");
           }
            return chain.filter(exchange);
       });
   }
    @Data
    public static class Config{
        private boolean consoleLog;
   }
}

运行测试

请求http://localhost:9527/payment/lb

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第6张图片 

实时效果反馈

1.服务网关Gateway自定义网关过滤器需要继承_____类。

A AbstractGatewayFilterFactory

B GatewayFilterFactory

C GatewayFilter 

D 以上都错误

服务网关Gateway_过滤器之全局过滤器

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第7张图片

全局过滤器作用于所有路由,无需配置。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。 

内置的全局过滤器

SpringCloud Gateway内部也是通过一系列的内置全局过滤器对整个路由转发进行处理的。

1、路由过滤器(Forward)

2、路由过滤器(LoadBalancerClient)

3、Netty路由过滤器

4、Netty写响应过滤器(Netty Write Response F)

5、RouteToRequestUrl 过滤器 

6、路由过滤器 (Websocket Routing Filter)

7、网关指标过滤器(Gateway Metrics Filter)

8、组合式全局过滤器和网关过滤器排序(Combined Global Filter and GatewayFilter Ordering)

9、路由(Marking An Exchange As Routed)

自定义全局过滤器 

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第8张图片

开发中的鉴权逻辑

1、当客户端第一次请求服务时,服务端对用户进行信息认证(登录)

2、认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证

3、以后每次请求,客户端都携带认证的token

4、服务端对token进行解密,判断是否有效。 

对于验证用户是否已经登录及鉴权的过程,可以在网关统一校验。 

下面我们通过自定义一个GlobalFIlter,去校验所有请求的请求参数中是否包含“token”,如果不包含请求参数“token”则不转发路由, 否则执行正常逻辑。

package com.tong.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* 自定义全局过滤器,需要实现GlobalFilter和
Ordered接口
*/
@Component
public class AuthGlobalFilter implements
GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange,GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        if (StringUtils.isEmpty(token)) {
            System.out.println("鉴权失败。确少token参数。");
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
       }
        if (!"jack".equals(token)) {
            System.out.println("token无效...");
          exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
       }
        // 继续执行filter链
        return chain.filter(exchange);
   }
    /**
     * 顺序,数值越小,优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
   }
}

测试

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第9张图片

实时效果反馈

1.服务网关Gateway自定义全局过滤器需要实现_____接口。

A AbstractGatewayFilterFactory

B GatewayFilterFactory

C GlobalFilter

D 以上都错误

2.服务网关Gateway自定义全局过滤器实现Ordered接口含义是 ___。

A 排序

B 设置比较器

C 设置全局过滤器执行顺序

D 以上都错误 

服务网关Gateway_网关的cors跨域配置

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第10张图片

为什么会出现跨域问题 

出于浏览器的同源策略限制。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上 的,浏览器只是针对同源策略的一种实现。

什么是跨域 

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url 不同即为跨域

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第11张图片

跨域问题演示 

编写index页面




    
    Title





问题出现

Spring Cloud【服务网关Gateway(过滤器详解、网关过滤器GatewayFilter、自定义网关过滤器、过滤器之全局过滤器、网关的cors跨域配置)】(七)_第12张图片

 

你可能感兴趣的:(Spring全家桶,java,运维,spring,boot,数据库)