1. 程式人生 > >spring cloud(四)-服務閘道器Zuul-過濾器

spring cloud(四)-服務閘道器Zuul-過濾器

前言

一般許可權控制,登入控制可以加到閘道器過濾器中。

1、過濾器的實現

繼承ZuulFilter,重寫4個方法filterTypefilterOrdershouldFilterrun。 filterType:過濾器的型別,它決定過濾器在請求的哪個生命週期中執行。 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;
    }
}