@Component //注入到spring容器
public class LoginFilter extends ZuulFilter {
@Override
public String filterType() {
//pre 请求在路由之前执行
//routing 在路由请求时调用
//post 在routing和error过滤器之后调用
//error 处理请求时发生错误调用
return FilterConstants.PRE_TYPE; //pre 请求在路由之前执行
}
@Override
public int filterOrder() {
//过滤器执行级别顺序 在请求头之前
return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true ;
}
@Override
public Object run() throws ZuulException {
//过滤器业务逻辑
//获取请求上下文
RequestContext ctx = RequestContext.getCurrentContext();
//获取request
HttpServletRequest request = ctx.getRequest();
//获取请求参数access-token
String token = request.getParameter("access-token");
//判断是否存在
if (StringUtils.isBlank(token)) {
//不存在则拦截
ctx.setSendZuulResponse(false);
//返回403
ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
}
//不存在则拦截
return null;
}
}
通过继承ZuulFilter然后覆写上面的4个方法,就可以实现一个简单的过滤器,下面就相关注意点进行说明
filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
pre:可以在请求被路由之前调用
route:在路由请求时候被调用
post:在route和error过滤器之后被调用
error:处理请求时发生错误时被调用
Zuul的主要请求生命周期包括“pre”,“route”和“post”等阶段。对于每个请求,都会运行具有这些类型的所有过滤器。
filterOrder:通过int值来定义过滤器的执行顺序(数字越大,优先级越低)
shouldFilter:返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。在上例中,我们直接返回true,所以该过滤器总是生效
run:过滤器的具体逻辑。需要注意,这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码