GateWay全局过滤器记录请求日志的记录以及实现跨域请求

719 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

一、GateWay全局过滤器和局部过滤器

上篇文章主要介绍了局部过滤器,需要在application.yml中进行配置,设置id和相关条件,对指定的内容进行处理。而全局过滤器则不需要进行配置,创建之后就可以对全局请求信息进行过滤处理。

局部过滤器和全局过滤器区别:

局部:局部针对某个路由, 需要在路由中进行配置

全局:针对所有路由请求, 一旦定义就会投入使用

下图为GateWay提供的内置全局过滤器

image.png

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、测试访问

浏览器请求接口 image.png

控制台查看日志信息

image.png

三、请求日志的记录

当各微服务通过GateWay进行请求的时候,那日志该如何记录呢,这样就需要启用 Reactor Netty 访问日志。如果是通过java -jar 运行则需要将GateWay项目打成jar包然后加上如下配置即可

-Dreactor.netty.http.server.accessLogEnabled=true

我这边使用idea编辑器就可以在vm option中进行配置,如下

image.png

它必须是 Java 系统属性,而不是 Spring Boot 属性。

配置完之后,访问链接就可以看到请求日志了

image.png

也可以将日志记录系统配置为具有单独的访问日志文件。以下示例创建一个 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、在未配置跨域设置的时候

使用浏览器打开文件 image.png

点击跨域请求访问ajax方法,就会提示跨域错误

image.png

4-1-3、在application.yml设置允许跨域

设置允许所有域名,请求所有资源

注意当前配置在spring.cloud.gateway

image.png

再次点击跨域请求,就可以成功访问了

image.png

4-2、通过Configuration设置Bean实现跨域

4-2-1、编写允许跨域的Configuration

image.png

@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中的跨域设置,然后请求

image.png