当前位置:   article > 正文

SpringCloud学习(9)-GateWay网关-自定义拦截器_spring gateway 自定义拦截器

spring gateway 自定义拦截器

GateWay Filter详细配置说明

gateway Filter官网:Spring Cloud Gateway

作用:
  • 请求鉴权
  • 异常处理
  • 记录接口调用时长统计
过滤器类别
  • 全局默认过滤器:官网:Spring Cloud Gateway,出厂默认已有的,直接用,作用于所有的路由,不推荐。
  • 单一内置过滤器:官网:Spring Cloud Gateway,也可以称为网关过滤器,这种过滤器主要是作用于单一路由或者某个路由分组
  • 自定义过滤器
过滤器配置详解
常见内置过滤器

增删改请求头响应头

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
  6. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  7. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  8. predicates:
  9. - Path=/pay/gateway/get/** # 断言,路径相匹配的进行路由
  10. filters:
  11. - AddRequestHeader=X-Request-username,value # 请求头kv,若一头含有多参则重写一行设置
  12. - RemoveRequestHeader=sec-fetch-site # 删除请求头sec-fetch-site
  13. - SetRequestHeader=sec-fetch-mode, Blue-updatebyzzyy # 将请求头sec-fetch-mode对应的值修改为Blue-updatebyzzyy
  14. - AddRequestParameter=customerId,9527001 # 新增请求参数Parameter:k ,v
  15. - RemoveRequestParameter=customerName # 删除url请求参数customerName,你传递过来也是null
  16. - AddResponseHeader=X-Response-hello, BlueResponse # 新增响应参数X-Response-atguigu并设值为BlueResponse
  17. - SetResponseHeader=Date,2099-11-11 # 设置回应头Date值为2099-11-11
  18. - RemoveResponseHeader=Content-Type # 将默认自带Content-Type回应属性删除

微服务路径和前缀进行配置:前缀修改

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
  6. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  7. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  8. predicates:
  9. #- Path=/pay/gateway/filter/** # 被分拆为: PrefixPath + Path
  10. - Path=/gateway/filter/** # 断言,为配合PrefixPath测试过滤,暂时注释掉/pay
  11. filters:
  12. - PrefixPath=/pay # http://localhost:9527/pay/gateway/filter

路径修改

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
  6. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  7. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  8. predicates:
  9. #- Path=/pay/gateway/filter/** # 被分拆为: PrefixPath + Path
  10. - Path=/XYZ/abc/{segment} # 断言,为配合SetPath测试,{segment}的内容最后被SetPath取代
  11. filters:
  12. - SetPath=/pay/gateway/{segment} # {segment}表示占位符,你写abc也行但要上下一致

重定向

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
  6. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  7. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  8. predicates:
  9. - Path=/gateway/filter/** # 断言,为配合PrefixPath测试过滤,暂时注释掉/pay
  10. filters:
  11. - RedirectTo=302, http://www.baidu.com/ # 访问

自定义过滤器:自定义全局过滤器获取接口耗时(不用配置,默认全局生效)

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  3. import org.springframework.cloud.gateway.filter.GlobalFilter;
  4. import org.springframework.core.Ordered;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.server.ServerWebExchange;
  7. import reactor.core.publisher.Mono;
  8. /**
  9. * @author sun
  10. * @date 2024/4/1
  11. */
  12. @Slf4j
  13. @Component
  14. public class CustomGlobalFilter implements GlobalFilter, Ordered {
  15. public static final String START_VISIT_TIME = "startVisitTime";
  16. @Override
  17. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  18. exchange.getAttributes().put(START_VISIT_TIME, System.currentTimeMillis());
  19. return chain.filter(exchange).then(Mono.fromRunnable(() -> {
  20. Long startVisitTime = exchange.getAttribute(START_VISIT_TIME);
  21. if (startVisitTime != null) {
  22. long endVisitTime = System.currentTimeMillis();
  23. log.info("=================================================");
  24. log.info("访问接口主机: {}", exchange.getRequest().getURI().getHost());
  25. log.info("访问接口端口: {}", exchange.getRequest().getURI().getPort());
  26. log.info("访问接口URL: {}", exchange.getRequest().getURI().getPath());
  27. log.info("访问接口参数: {}", exchange.getRequest().getURI().getRawQuery());
  28. log.info("访问接口耗时: {}ms", (endVisitTime - startVisitTime));
  29. log.info("=================================================");
  30. }
  31. }));
  32. }
  33. // 数字越小优先级越高
  34. @Override
  35. public int getOrder() {
  36. return -1;
  37. }
  38. }

自定义过滤器:自定义单一过滤器(需要在配置文件设置)

  1. import lombok.Getter;
  2. import lombok.Setter;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.cloud.gateway.filter.GatewayFilter;
  5. import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
  6. import org.springframework.http.HttpStatus;
  7. import org.springframework.http.server.reactive.ServerHttpRequest;
  8. import org.springframework.stereotype.Component;
  9. import java.util.List;
  10. /**
  11. * @author sun
  12. * @date 2024/4/1
  13. */
  14. @Slf4j
  15. @Component
  16. public class CustomSingleGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomSingleGatewayFilterFactory.Config> {
  17. public CustomSingleGatewayFilterFactory() {
  18. super(CustomSingleGatewayFilterFactory.Config.class);
  19. }
  20. @Override
  21. public GatewayFilter apply(CustomSingleGatewayFilterFactory.Config config) {
  22. return (exchange, chain) -> {
  23. log.info("进入单一的过滤器 status: {}", config.getStatus());
  24. ServerHttpRequest request = exchange.getRequest();
  25. if (request.getQueryParams().containsKey(config.getStatus())) {
  26. return chain.filter(exchange);
  27. }
  28. exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
  29. return exchange.getResponse().setComplete();
  30. };
  31. }
  32. @Override
  33. public List<String> shortcutFieldOrder() {
  34. return List.of("status");
  35. }
  36. @Getter
  37. @Setter
  38. public static class Config {
  39. private String status; // 设置一个标志位, 匹配上才能访问
  40. }
  41. }

配置:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/667810
推荐阅读
相关标签
  

闽ICP备14008679号