携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
一、GateWay全局过滤器和局部过滤器
上篇文章主要介绍了局部过滤器,需要在application.yml中进行配置,设置id和相关条件,对指定的内容进行处理。而全局过滤器则不需要进行配置,创建之后就可以对全局请求信息进行过滤处理。
局部过滤器和全局过滤器区别:
局部:局部针对某个路由, 需要在路由中进行配置
全局:针对所有路由请求, 一旦定义就会投入使用
下图为GateWay提供的内置全局过滤器
LoadBalancer:只要转发配置了lb就会启用负载均衡过滤器策略。
二、自定义全局过滤器
可以使用全局过滤器来进行记录日志的操作,下面就来实现一个记录日志的全局过滤器。在日常项目开发中可以使用全局过滤器做鉴权、日志等。
2-1、创建日志全局过滤器
2-1-1、创建全局日志过滤器方法
全局过滤器,需要实现GlobalFilter接口,并且重写filter方法。
下面简单做一个记录请求地址的日志记录器
@Component
public class LogFilter implements GlobalFilter {
Logger log= LoggerFactory.getLogger(this.getClass());
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("request url:"+exchange.getRequest().getPath().value());
return chain.filter(exchange);
}
}
2-2-2、测试访问
浏览器请求接口
控制台查看日志信息
三、请求日志的记录
当各微服务通过GateWay进行请求的时候,那日志该如何记录呢,这样就需要启用 Reactor Netty 访问日志。如果是通过java -jar 运行则需要将GateWay项目打成jar包然后加上如下配置即可
-Dreactor.netty.http.server.accessLogEnabled=true
我这边使用idea编辑器就可以在vm option中进行配置,如下
它必须是 Java 系统属性,而不是 Spring Boot 属性。
配置完之后,访问链接就可以看到请求日志了
也可以将日志记录系统配置为具有单独的访问日志文件。以下示例创建一个 Logback 配置:
<configuration>
<!--可以引用SpringBoot全局配置文件中的配置项-->
<springProperty scope="context" name="dateformat" source="logging.pattern.dateformat"
defaultValue="-yyyy-MM-dd HH:mm:ss.SSS"/>
<!--appender 追加器 日志以哪种方式进行输出
name 取个名字
class 不同实现类会输出到不同地方
ch.qos.logback.core.ConsoleAppender 输出到控制台
-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--格式-->
<encoder>
<springProfile name="dev">
<pattern>%-4relative [%thread] %-5level %logger{35} ---- %msg %n</pattern>
</springProfile>
<springProfile name="pro">
<pattern>%-4relative [%thread] %-5level %logger{35} ++++++ %msg %n</pattern>
</springProfile>
<springProfile name="rel">
<pattern>%-4relative %d{${dateformat}} [%thread] %-5level %logger{35} ++++++ %msg %n</pattern>
</springProfile>
</encoder>
</appender>
<logger name="com.jony" level="ERROR"/>
<!--控制所有的日志级别-->
<root level="INFO">
<!-- 将当前日志级别输出到哪个追加器上面 -->
<appender-ref ref="STDOUT" />
</root>
</configuration>
四、GateWay设置跨域请求
在前后端分离开发的时候,往往涉及到联调的时候,如果不设置允许跨域请求,那么前端就无法在跨域的情况下实现请求接口。下面来介绍两种实现方式
4-1、通过配置文件实现
官网也给了案例,如下: docs.spring.io/spring-clou…
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': #设置允许跨域访问的资源
allowedOrigins: "https://docs.spring.io" #允许跨域域名
allowedMethods: #允许跨域的请求类型
- GET
4-1-1、在项目中添加一个ajax请求文件
通过ajax来请求GateWay
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<input type="button" value="跨域请求" onclick="getData()">
<script>
function getData() {
$.get('http://localhost:8088/order/add',function(data){
alert(data)
});
}
</script>
</body>
</html>
4-1-2、在未配置跨域设置的时候
使用浏览器打开文件
点击跨域请求访问ajax方法,就会提示跨域错误
4-1-3、在application.yml设置允许跨域
设置允许所有域名,请求所有资源
注意当前配置在spring.cloud.gateway
下
再次点击跨域请求,就可以成功访问了
4-2、通过Configuration设置Bean实现跨域
4-2-1、编写允许跨域的Configuration
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*"); //允许的请求类型
config.addAllowedOrigin("*"); //允许的请求来源
config.addAllowedHeader("*"); //允许的请求头信息
//设置允许请求的资源
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
4-2-2、请求访问
注释掉刚刚在application.yml中的跨域设置,然后请求