-
zuul网关拦截器的执行:
a. 首先根据filterType决定顺序pre优先post执行,此时filterOrder没有作用;
b. filterType相同情况下,filterOrder值越小,优先级越高,负数也一样;
c. pre拦截器在请求被路由前执行,一般进行请求控制;类似于AOP中的前置通知
d. post拦截器在请求被路由后执行,可对返回值进行处理,一般进行请求日志输出; 类似于AOP中的后置通知 ; -
请求控制一般要在前置拦截器中进行
通过校验需要拦截的请求,要设置setSendZuulResponse(false),表示该请求不进行路由; setResponseStatusCode设置respronce的状态码;setResponseBody设置返回值信息;
if(count > 3) {
LOGGER.info("被拦截的请求:" + key);
// 过滤该请求, 不对其进行路由
ctx.setSendZuulResponse(false);
// 返回错误码
ctx.setResponseStatusCode(213);
// 返回错误内容
RestMsg restMsg = new RestMsg();
restMsg.setMsg("To Maney Request!");
restMsg.setStatus(StatusEnum.ADDCARFAIL.value());
ctx.setResponseBody(restMsg.toString());
} else {
ctx.setSendZuulResponse(true);
long incr = redisComponent.incr(key);
LOGGER.info("incrbb:" + incr);
}
- 进行跨域请求的时候,客户端会发送一个options请求, 该类型请求一般不进行拦截,可在shouldFilter方法中进行如下控制;也可在此处设置setSendZuulResponse(false),使得后序拦截器不对此类请求进行拦截
pre拦截器:
@Override
public boolean shouldFilter() {
//跨域设置 OPTIONS请求不进行拦截
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
if(request.getMethod().equals(RequestMethod.OPTIONS.name())){
//只过滤OPTIONS 请求
ctx.setSendZuulResponse(false);
return false;
}
return true;
}
post拦截器:
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
return ctx.sendZuulResponse();
}