TZ_14_Zuul网关_过滤器

Posted asndxj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TZ_14_Zuul网关_过滤器相关的知识,希望对你有一定的参考价值。

1.Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。

2.自定义过滤器实现用户登陆时需要携带一个Key才可以登陆,否则返回403

  

  1>zuul启动坐标

    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

 

   2.>启动器类中需要加上@EnableZuulProxy

@SpringCloudApplication
@EnableZuulProxy
public class Zull {
    public static void main(String[] args) {
        SpringApplication.run(Zull.class);
    }
}

 

  

   3.>创建一个过滤器需要继承ZuulFilter类 并实现4个方法

  • shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。

  • run:过滤器的具体业务逻辑。

  • filterType:返回字符串,代表过滤器的类型。包含以下4种:

    • pre:请求在被路由之前执行

    • routing:在路由请求时调用

    • post:在routing和errror过滤器之后调用

    • error:处理请求时发生错误调用

  • filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高

/**
 * 需求完成在访问时  判断用户是否登陆
 */
@Component
public class CustomFilter extends ZuulFilter {
    @Override
    //过滤器的类型
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    //过滤器的级别
    public int filterOrder() {
        return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
    }

    @Override
    //是否开启过滤
    public boolean shouldFilter() {
        return true;
    }

    @Override
    //具体业务
    public Object run() throws ZuulException {
        //获取request
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        //获得参数
        String token = request.getParameter("token");
       //判断是否存在
        /*if(token!=null && token.trim().isEmpty()){}*/

        if (StringUtils.isBlank(token)){
            //不存在 未登录  则拦截
            currentContext.setSendZuulResponse(false);
            //返回403权限不足
            currentContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value());

        }

        return null;
    }
}

 

  

Zuul的applciation.yaml配置

server:
  port: 10010
zuul:
  routes:
    user-service:
      path: /User/**
      serviceId: user-service
      strip-prefix: false

     #去除不想要的路由地址
  ignored-services:

#从eureka拉取服务
eureka:
  client:
    service-url:
        defaultZone: http://127.0.0.1:10087/eureka/

#实现熔断器 Zuul自动配置
hystrix:
  command:
      default:
        execution:
          isolation:
            thread:
             # 熔断超时时长:6000ms
              timeoutInMillisecond: 6000

#实现负载均衡 Zuul自动配置
ribbon:
  ConnectionTimeout: 500
  ReadTimeout:2000

 

以上是关于TZ_14_Zuul网关_过滤器的主要内容,如果未能解决你的问题,请参考以下文章

TZ_06_SpringMVC_拦截器的配置

TZ_14_Feign的客户端和Feign的负载均衡

Spring boot zuul错误重定向请求

Spring Cloud微服务安全实战_4-10_用spring-cloud-zuul-ratelimit做限流

zuul API 网关过滤器

Zuul网关过滤器中转发头信息不起作用