前言
一般权限控制,登录控制可以加到网关过滤器中。
1、过滤器的实现
继承ZuulFilter
,重写4个方法filterType
、filterOrder
、shouldFilter
、run
。
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;
}
}