栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-11

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-11

                                 ## 微服务学习打卡-路由的过滤器配置

介绍:
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理
Spring提供了31种不同的路由过滤器工厂,这么多等到需要到时候就可以去查。
简单用案例讲解一下AddRequestHeader:
这是给当前请求添加一个头部信息。
首先引入nacos和GateWay依赖:

  
           
               com.alibaba.cloud
               spring-cloud-starter-alibaba-nacos-discovery
               2.2.6.RELEASE
           
           
           
               org.springframework.cloud
               spring-cloud-starter-gateway
           

在yml中配置:

 filters: #过滤器  给头部添加信息,Truth相当于一个标识
            - AddRequestHeader=Truth, tanxiangwen!

其次编写controller获取头部信息:

 @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id,@RequestHeader("Truth") String truth) {
        System.out.println("Truth:"+truth);
        return userService.queryById(id);
    }

控制台输出:

全局过滤器:
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。
定义方式是实现GlobalFilter接口。
总结就是:
全局过滤器有路由过滤器的基本功能而且可以自定义实现逻辑代码
需求:
定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
参数中是否有authorization,
authorization参数值是否为admin
如果同时满足则放行,否则拦截
实现:
首先编写一个类来实现GlobalFilter:

package com.tan;

import lombok.val;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
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 {
    
    
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap queryParams = request.getQueryParams();
        //获取authorization参数
        String authorization = queryParams.getFirst("authorization");
        //判断是否=admin
        if("admin".equals(authorization)){
            //放行
            return chain.filter(exchange);
        }
        //拦截,设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//未认证状态

        return exchange.getResponse().setComplete();



    }
}

最后启动userservice和网关验证:
1.没有任何参数:

2.有参数authorization,但不是admin:

3.参数authorization=admin:

过滤器执行顺序:
每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/322633.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号