spring cloud(四)-服务网关Zuul-过滤器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lh87270202/article/details/84024898

前言

一般权限控制,登录控制可以加到网关过滤器中。

1、过滤器的实现

继承ZuulFilter,重写4个方法filterTypefilterOrdershouldFilterrun
filterType:过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。

  • pre:可以在请求被路由之前调用。
  • routing:在路由请求时候被调用。
  • post:在routing和error过滤器之后被调用。
  • error:处理请求时发生错误时被调用。

filterOrder:过滤器的执行顺序。当定义多个过滤器时,需要根据该方法返回的值来依次执行。
shouldFilter:判断该过滤器是否需要被执行。
run:过滤器的具体逻辑。
实现一个登录拦截的过滤器

public class TokenFilter extends ZuulFilter {
     /**
     * 忽略拦截url
     */
    private final static List<String> ignoreUrl = Arrays.asList("/clockbone/login",
            "/clockbone/logout",
            "/clockindex/**");        
    @Override
    public String filterType() {
      //代表会在请求被路由之前执行
        return PRE_TYPE;
    }

    @Override
    public int filterOrder() {
       //过滤器执行顺序
        return PRE_DECORATION_FILTER_ORDER - 1;
    }

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

    @Override
    public Object run() {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String uri = request.getRequestURI();
        if (!hasIgnoreUrl.contains(uri)) {
            String token = "";
            try {
                token = request.getParameter("accessToken");
            } catch (Exception e) {
                log.error("json 异常 {}", e.getMessage());
            }
            if (StringUtils.isBlank(token)) {
                //登陆授权未通过
                requestContext.setSendZuulResponse(false);
                requestContext.setResponseStatusCode(HttpStatus.OK.value());
                requestContext.setResponseBody("not login");
                HttpServletResponse response = requestContext.getResponse();
                response.setCharacterEncoding("utf-8");
            } else {
                //登陆授权通过
                requestContext.addZuulRequestHeader("userId",userId);
            }
        }
        requestContext.addZuulRequestHeader(“ip”, ip);
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/lh87270202/article/details/84024898