SpringCloud(Finchley.SR2版本)踩坑笔记(七)------- zuul Filter

之前我们配置过 zuul 作为 api 网关 《SpringCloud(Finchley.SR2版本)踩坑笔记(四)------- zuul基础》,zuul 还可以自定义一系列的过滤器,来对请求做一些预先或者后续的处理。

zuul 的 filter 类型分为:

1. pre:在请求被路由之前过滤,可以通过这种过滤器来处理一些类似签名校验,用户身份认证等操作。

2. route:这种过滤器用于构建发送给微服务的请求。

3. post:这种过滤器在微服务有返回结果时过滤,可以用来处理一些标准的 http header,记录返回值之类的操作。

4. error:顾名思义,在发成错误时触发的过滤器。

定义一个 Filter 需要继承 ZuulFilter

public class SignatureFilter extends ZuulFilter {

    public SignatureFilter() {
        // 构造函数
    }

    @Override
    public String filterType() {
        // 定义 filter 的类型
        return FilterConstants.PRE_TYPE; // 可以在请求被路由之前调用
    }

    @Override
    public int filterOrder() {
        // filter 执行顺序,数字越小优先级越高
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        // 是否要被过滤,可以增加自己的业务逻辑判断最后返回 true or false
        return true;
    }

    @Override
    public Object run() {
        // 过滤逻辑实现
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        ctx.setSendZuulResponse(true);
        ctx.setResponseStatusCode(200);

        return null;
    }

}

这样一个自定义的 Filter 就完成了。

很多情况下,我们开发的微服务接口都需要做跨域请求的处理,在 zuul 中,可以通过自定义 Filter 的方式来解决,也可以通过如下方式来自定义一个config解决。

@Configuration
public class CorsConfig {
    
    private final Logger LOGGER = LoggerFactory.getLogger(ZuulApplication.class);
    
    @Bean
    public CorsFilter corsFilter() {
        LOGGER.info("zuul add cors config");
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); // 允许cookies跨域
        config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
        config.addAllowedHeader("*");// #允许访问的头信息,*表示全部
        config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
        config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许
        source.registerCorsConfiguration("/**", config);

        return new CorsFilter(source);
    }
}

跨域请求中,关键是服务器将 response 设置 header  ACCESS_CONTROL_ALLOW_ORIGIN 为正确的值,但是在上述配置的注释信息中可以得知,addAllowedOrigin("*") 在 springmvc 中会自动设置为 request header 的 origin,这时你可能在客户端的请求中发现 response.header 中的 ACCESS_CONTROL_ALLOW_ORIGIN 会有两个值,导致跨域请求在前端认为失败。原因是 zuul 又将这个 header 写了一遍,解决的方法是配置 zuul 的 sensitiveHeaders

zuul:
  routes:
    app-server:
      path: /test-server/**
      sensitiveHeaders: Access-Control-Allow-Credentials, Access-Control-Allow-Origin
      serviceId: test-server
      stripPrefix: false

这样就能解决了,当然也可以直接配置  zuul.sensitiveHeaders 做全局配置。

sensitiveHeaders 的作用是将设置的 header 不向下层微服务传递。还有一个配置是 ignoredHeaders,这里面的 header 会向下层微服务传递,但是微服务再次转发的时候就不会有了。

另外 stripPrefix 的作用是影响传递到微服务的请求地址,比如一个请求:http://zuul-server/test-server/test,stripPrefix = false,那么微服务获得的地址就是 /test-server/test,如果为 true, 那么微服务获得地址就是 /test

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目说明 该项目是一个典型的由Spring Cloud管理的微服务项目,主要包括如下模块 micro-service-cloud─────────────────顶层项目 ├──cloud-service-core───────────────基础核心模块 ├──cloud-service-tools──────────────全局通用工具类 ├──cloud-service-reids──────────────Redis二次封装 ├──cloud-eureka-server──────────────服务注册中心[8761] ├──cloud-turbine-server─────────────断路器聚合监控[8769] ├──cloud-zipkin-server──────────────链路追踪监控[9411] ├──cloud-zuul-server────────────────第一代服务网关(Zuul)[8080] ├──cloud-gateway-server─────────────第二代服务网关(Gateway)[8080] ├──cloud-modules-app────────────────App微服务模块 ├───────modules-app-user────────────App用户服务模块[努力更新中] ├───────modules-app-doctor──────────App医生服务模块[努力更新中] ├──cloud-modules-service────────────微服务通用服务模块 ├───────mongodb-file-service────────Mongodb文件服务模块[11010] ├───────redis-delay-service─────────延迟消费服务模块[11020] ├──cloud-modules-web────────────────Web微服务模块 ├───────modules-web-security────────Web医生服务模块[12010] ├───────modules-web-user────────────Web用户服务模块[12020] ├──cloud-modules-wechat─────────────Wechat微服务模块 ├───────modules-wechat-user─────────Wechat用户服务模块[努力更新中] └───────modules-wechat-doctor───────Wechat医生服务模块[努力更新中] 修改日志 修改日志 修改人 修改日期 版本计划 V1.0 刘岗强 2019-01-07 项目初始化 V1.1 刘岗强 待定 新增自动问答 项目介绍 基于Spring Cloud Finchley SR2 Spring Boot 2.0.7的最新版本。 核心基础项目内实现类自定义的权限注解,配合RBAC权限模型+拦截器即可实现权限的控制,具体的参考项目中的实现。同时也封装了一些顶层类和结果集等。 注册中心实现高可用配置,详情见eureka的one、two、three三个配置文件,摘要如下。 ------------------------------------------配置节点一---------------------------------------------- server: port: 8761 spring: application: name: cloud-eureka-server eureka: instance: hostname: cloud.server.one prefer-ip-address: true instance-id: ${spring.cloud.client.ip-address}:${server.port}:${spring.application.name} client: healthcheck: enabled: true register-with-eureka: false fetch-registry: false service-url: defaultZone: http://cloud.server.two:8762/eureka/,http://cloud.server.three:8763/eureka/ ------------------------------------------配置节点二----------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值