spring cloud(四)-服務閘道器Zuul-過濾器
阿新 • • 發佈:2018-12-21
前言
一般許可權控制,登入控制可以加到閘道器過濾器中。
1、過濾器的實現
繼承ZuulFilter
,重寫4個方法filterType
、filterOrder
、shouldFilter
、run
。
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; } }