zuul(一)pre和post过滤器

新建项目api-gateway,
pom

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-client</artifactId>
</dependency>

加入zuul的配置

zuul:
  routes:
#  自定义路由的名称
    myProduct:
      path: /myProduct/**
      serviceId: product
#      设置cookie 等消息可以传递到后端
      sensititiveHeaders:
#    简洁写法
#    product: /myProduct/**
#    禁止外部访问
  ignored-patterns:
    - /**/product/listForOrder
management:
  security:
    enabled: false

在main方法加上注解

@EnableZuulProxy//实现路由转发功能

新建类ZuulConfig用于动态刷新统一配置中心config中的动态刷新

@Component
public class ZuulConfig {

    @ConfigurationProperties("zuul")
    @RefreshScope//动态刷新
    public ZuulProperties zuulProperties(){
        return new ZuulProperties();
    }
}

第一种使用情况,使用前置(pre)过滤器,来验证token是否有效

/**
 *   token验证
 * @author xwq
 * @create 2020-04-23 15:13
 **/
@Component
public class TockeFilter  extends ZuulFilter {
    @Override
    public String filterType() {
        return PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return PRE_DECORATION_FILTER_ORDER-1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 实现的逻辑
     * @return
     */
    @Override
    public Object run() {
        RequestContext requestContext = RequestContext.getCurrentContext();

        HttpServletRequest request = requestContext.getRequest();

        //这里是从url参数获取
        String token = request.getParameter("token");

        if(StringUtils.isEmpty(token)){
            //没有权限
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
        }

        return null;
    }
}

第二种,使用后置(post),来给返回的结果添加东西

/**
 *    往返回的数据里面添加东西
 *
 * @author xwq
 * @create 2020-04-23 15:28
 **/
@Component
public class AddResponseHeaderFilter extends ZuulFilter {


    @Override
    public String filterType() {
        return POST_TYPE;
    }

    @Override
    public int filterOrder() {
        return SEND_RESPONSE_FILTER_ORDER - 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 实现的逻辑
     * 在返回结果中加东西
     * @return
     */
    @Override
    public Object run() {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletResponse  response = requestContext.getResponse();

        response.setHeader("X-Foo", UUID.randomUUID().toString());
        System.out.println(".....");
        return null;
    }
}

你可能感兴趣的:(spring,cloud)