CSDN话题挑战赛第2期
参赛话题:学习笔记
个人名片:
博主:酒徒ᝰ.
个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志:三人行,必有我师焉。
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看
四、路由过滤器
3.全局过滤器
之前的过滤器处理逻辑都是固定的,但是很多时候我们有自己需要实现的一套过滤逻辑,这个时候就需要使用全局过滤器。
方法:
实现GlobalFilter接口
步骤:
①实现GlobalFilter接口
②添加@Order注解或实现Ordered接口
③编写处理逻辑
作用:
对所有路由都生效的过滤器,并且可以自定义处理逻辑
4.案例:定义全局过滤器,拦截并判断用户身份
1.定义一个新的类
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.了解
- 跨域:
- 域名不同:.com与.cn
- 域名相同,端口不同 ::8080与:8081
- 跨域问题:
浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
- 解决方案:
CORS
- 方法:
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 # 这次跨域检测的有效期
- CORS跨域要配置的参数包括哪几个?
•允许哪些域名跨域?
•允许哪些请求头?
•允许哪些请求方式?
•是否允许使用cookie?
•有效期是多久?
2.测试
启动程序,使用前端工具(这里我使用的是VSCode)打开index.html,浏览器报如下错误:
六、限流
- 限流:对应用服务器的请求做限制,避免因过多请求而导致服务器过载甚至宕机。限流算法常见的包括两种:
计数器算法,又包括窗口计数器算法、滑动窗口计数器算法
漏桶算法(Leaky Bucket)
令牌桶算法(Token Bucket)
- 限流有什么作用?
•限流是保护服务器,避免因过多请求而导致服务器过载甚至宕机
- 限流算法:
•计数器算法
•漏桶算法
•令牌桶算法