欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Zuul:Cookie和动态路由

程序员文章站 2022-06-03 18:57:34
...
经常会涉及到Cookie,在这里使用到了Zuul这个组件,Cookie它是无法传递过去的,我们先来实验一下,

看一下这个请求有没有带Cookie

localhost:8040/myProduct/product/list

@RestController
@RequestMapping("/product")
public class ProductController {
	
    @Autowired
    private ProductService productService;

    /**
     * 1. 查询所有在架的商品
     */
    @GetMapping("/list")
    public List<ProductInfo> list(HttpServletRequest Request) {
        //1. 查询所有在架的商品
        List<ProductInfo> productInfoList = productService.findUpAll();
        return productInfoList;
    }

}

从request里面传递过来

/**
 * The service ID (if any) to map to this route. You can specify a physical URL or
 * a service, but not both.
 */
private String serviceId;

他都是作为这个对象的一些字段,这里有两个字段

/**
 * List of sensitive headers that are not passed to downstream requests. Defaults
 * to a "safe" set of headers that commonly contain user credentials. It's OK to
 * remove those from the list if the downstream service is part of the same system
 * as the proxy, so they are sharing authentication data. If using a physical URL
 * outside your own domain, then generally it would be a bad idea to leak user
 * credentials.
 */
private Set<String> sensitiveHeaders = new LinkedHashSet<>();

敏感头,所谓敏感是不让看的,敏感头就不会给后面的服务了,默认值是什么

/**
 * List of sensitive headers that are not passed to downstream requests. Defaults to a
 * "safe" set of headers that commonly contain user credentials. It's OK to remove
 * those from the list if the downstream service is part of the same system as the
 * proxy, so they are sharing authentication data. If using a physical URL outside
 * your own domain, then generally it would be a bad idea to leak user credentials.
 */
private Set<String> sensitiveHeaders = new LinkedHashSet<>(
		Arrays.asList("Cookie", "Set-Cookie", "Authorization"));

默认对三个字段,Cookie这三个,那么我们现在想让他不过滤掉Cookie,你只需要把它设置为空就好了,

zuul.routes.myProduct.sensitiveHeaders=

这里报了一个错超时,因为我们打了一个断点,没关系,再来刷新一下,跳到打断点的地方,已经可以获取到cookie了

这就是敏感头的过滤,大家以后有需要的话加上这么一个配置,对于Zuul还有什么需要改进的呢,一旦我们再增加一个路由的

话,那我是不是得再配置一遍,我再重启一下,我们能不能做大动态路由呢,也就是改了配置直接让他生效,这不就是动态

配置吗,我们之前也有学到过,只要把这一块的配置放到Git上面来,名字叫api-gateway-dev.yml

我先全部复制过来,动态配置我们之前已经讲过,Zuul动态配置需要注意的点,第一点就是我们提到的,Spring Cloud Bus

版本问题,这边你得改一下,他在这个版本上有一些Bug,这是第一点,我们如何把这上面的配置改动了之后,你代码里面

要做到动态更新,创建一个ZuulConfig

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.stereotype.Component;

@Component
public class ZuulConfig {

  @ConfigurationProperties("zuul")
  @RefreshScope
  public ZuulProperties zuulProperties() {
      return new ZuulProperties();
  }
}

大家肯定想到了一个前缀,这个前缀,那里面怎么写呢,写哪些属性呢,其实你是不需要写属性的,Zuul已经写过了

有哪些属性,所以我们只需要查到他的属性,刚刚从属性里面点进去,这个类还在,其实就是这个类,跟我们的写法都是一样的

@Data
@ConfigurationProperties("zuul")
public class ZuulProperties {

org.springframework.cloud.netflix.zuul.filters.ZuulProperties

把这些配置写到这个类里面来,你只需要这么写,当然这个地方注意,你要把这些配置写到这儿来了,@RefreshScope,这样写

就可以完成动态注入,如果觉得没有必要新建一个类,你也可以这样子来写,把它复制一下,你可以直接写到启动类里面,

@EnableZuulProxy
@SpringBootApplication
public class APIGatewayApplication {
  public static void main(String[] args) {
    SpringApplication.run(APIGatewayApplication.class, args);
  }

  @ConfigurationProperties("zuul")
  @RefreshScope
  public ZuulProperties zuulProperties() {
      return new ZuulProperties();
  }
}

这样子也是可以的,动态路由希望自己去实现