相关文章推荐
严肃的围巾  ·  python ...·  4 月前    · 
沉稳的炒饭  ·  Excel-VBA Error - ...·  8 月前    · 
首发于 spring cloud

Spring Cloud gateway 三 自定义过滤器GatewayFilter

之前zuul 网关介绍。他有过滤器周期是四种,也是四种类型的过滤器。而gateway 只有俩种过滤器:“pre” 和 “post”。


  • PRE: 这种过滤器在请求被路由之前调用。


  • POST:这种过滤器在路由到微服务以后执行。
    -



这俩种过滤器是不是很熟悉。其实和zuul的过滤器很像。


但是gateway 过滤器又可以分为俩种。GatewayFilter 与 GlobalFilter。


  • GlobalFilter 全局过滤器


  • GatewayFilter 将应用到单个路由或者一个分组的路由上。



还有内置的过滤器断言机制。在上一篇已经做过介绍。本篇就不在介绍。


同样全局过滤器也在上一篇列举了全局过滤器的一种写法,有兴趣的同学可以回过头看一下。


自定义过滤器


创建ServerGatewayFilter 类


package com.xian.cloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
 * <Description>
 * @author xianliru@100tal.com
 * @version 1.0
 * @createDate 2019/11/07 17:34
@Slf4j
public class ServerGatewayFilter implements GatewayFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("ServerGatewayFilter filter ");
        return chain.filter( exchange );
    @Override
    public int getOrder() {
        return 0;
}


创建 GatewayRoutesConfiguration


package com.xian.cloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 * <Description>
 * @author xianliru@100tal.com
 * @version 1.0
 * @createDate 2019/11/08 09:45
@Configuration
@Slf4j
public class GatewayRoutesConfiguration {
     * java 配置 server 服务路由
     * @param builder
     * @return
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        log.info("ServerGatewayFilter filtet........");
        return builder.routes()
                .route(r ->
                        r.path("/server/**")
                                .filters(
                                        f -> f.stripPrefix(1)
                                                .filters(new ServerGatewayFilter())