SpringCloud——网关3

CSDN话题挑战赛第2期
参赛话题:学习笔记

请添加图片描述
个人名片:

博主酒徒ᝰ.
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志三人行,必有我师焉。

请添加图片描述
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

四、路由过滤器

3.全局过滤器

之前的过滤器处理逻辑都是固定的,但是很多时候我们有自己需要实现的一套过滤逻辑,这个时候就需要使用全局过滤器。
方法:
实现GlobalFilter接口
步骤:
①实现GlobalFilter接口
②添加@Order注解或实现Ordered接口
③编写处理逻辑
作用:
对所有路由都生效的过滤器,并且可以自定义处理逻辑

4.案例:定义全局过滤器,拦截并判断用户身份

1.定义一个新的类
image.png
2.编写过滤器

package cn.itcast.gateway;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        //1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        //2.获取authorization参数
        String auth = params.getFirst("authorization");
        //3.校验
        if ("admin".equals(auth)){
    
    
            return chain.filter(exchange);
        }
        //4.拦截
        //4.1禁止访问
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //4.2结束处理
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
    
    
        return -1;
    }
}

了解:
@Order注解与Ordered接口具有相同的作用。都是变为bean,便于启动类中@SpringBootApplication查询到。

5.过滤器的执行顺序

1.order值越小,优先级越高。
2.order值相同时,ldefaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

五、跨域请求

1.了解

  1. 跨域:
  • 域名不同:.com与.cn
  • 域名相同,端口不同 ::8080与:8081
  1. 跨域问题:

浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

  1. 解决方案:

CORS

  1. 方法:
spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期
  1. CORS跨域要配置的参数包括哪几个?

•允许哪些域名跨域?
•允许哪些请求头?
•允许哪些请求方式?
•是否允许使用cookie?
•有效期是多久?

2.测试

启动程序,使用前端工具(这里我使用的是VSCode)打开index.html,浏览器报如下错误:
image.png

六、限流

  1. 限流:对应用服务器的请求做限制,避免因过多请求而导致服务器过载甚至宕机。限流算法常见的包括两种:

计数器算法,又包括窗口计数器算法、滑动窗口计数器算法
漏桶算法(Leaky Bucket)
令牌桶算法(Token Bucket)

  1. 限流有什么作用?

•限流是保护服务器,避免因过多请求而导致服务器过载甚至宕机

  1. 限流算法:

•计数器算法
•漏桶算法
•令牌桶算法

猜你喜欢

转载自blog.csdn.net/m0_65144570/article/details/127218433