import staticorg.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;importjavax.servlet.http.HttpServletRequest;importcom.netflix.zuul.ZuulFilter;importcom.netflix.zuul.context.RequestContext;importcom.netflix.zuul.exception.ZuulException;public class ThirdPreFilter extendsZuulFilter {/*** 设置filter的类型,支持4种类型
* {@linkorg.springframework.cloud.netflix.zuul.filters.support.FilterConstants}
*
* ERROR_TYPE = "error";//这种过滤器是在整个生命周期内,如果发生异常,就执行该filter,可以做全局异常处理。
* POST_TYPE = "post";//这种过滤器是在端点请求完毕,返回结果或者发生异常后执行的filter。如果需要对返回的结果进行再次处理,可以在这种过滤中处理逻辑。
* PRE_TYPE = "pre"; //在zuul网关按照规则路由到下级服务之前执行,如果需要对请求进行预处理,可以使用这种类型的过滤器。如:认证鉴权,限流等。
* ROUTE_TYPE = "route";//这种过滤器是zuul路由动作的执行者,是Apache HttpClient或Ribbon构建和发送原始HTTP请求的地方,现在也支持OKHTTP。
*
*
*@return
*/@OverridepublicString filterType() {returnPRE_TYPE; }/*** 设置filter的执行顺序,数字越小,优先级越高,反之越低
*
*@return
*/@Overridepublic intfilterOrder() {return 3;
}/*** 是否执行该过滤器,可以作为一个开关,如果一直都被执行,直接返回true即可
*
*@return
*/@Overridepublic booleanshouldFilter() {
RequestContext ctx=RequestContext.getCurrentContext();//从上下文获取logic-is-success值,用于判断此Filter是否执行
return (boolean) ctx.get("logic-is-success");
}/*** 该自定义filter的业务逻辑
*
*@return*@throwsZuulException*/@Overridepublic Object run() throwsZuulException {
System.out.println("这是ThirdPreFilter!");//从RequestContext获取上下文
RequestContext ctx =RequestContext.getCurrentContext();//从上下文获取HttpServletRequest
HttpServletRequest request =ctx.getRequest();//从request尝试获取b参数值
String b = request.getParameter("b");//如果b参数值为空则进入此逻辑
if (null ==b) {//对该请求禁止路由,也就是禁止访问下游服务
ctx.setSendZuulResponse(false);//设定responseBody供PostFilter使用
ctx.setResponseBody("{\"status\":500,\"message\":\"b参数为空!\"}");//logic-is-success保存于上下文,作为同类型下游Filter的执行开关,假定后续还有自定义Filter当设置此值
ctx.set("logic-is-success", false);//到这里此Filter逻辑结束
return null;
}//设置避免报空指针异常
ctx.set("logic-is-success", true);return null;
}
}