Zuul【自定义Filter】
2019-10-28 06:26:57来源:博客园 阅读 ()
Zuul【自定义Filter】
实际业务中,如果要自定义filter过滤器,只需集成ZuulFIlter类即可,该类是个抽象类,它实现了IZuulFIlter接口,我们需要实现几个方法,如下示例:
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE; import javax.servlet.http.HttpServletRequest; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException;
public class ThirdPreFilter extends ZuulFilter { /** * 设置filter的类型,支持4种类型 * {@link org.springframework.cloud.netflix.zuul.filters.support.FilterConstants} * <pre> * ERROR_TYPE = "error";//这种过滤器是在整个生命周期内,如果发生异常,就执行该filter,可以做全局异常处理。 * POST_TYPE = "post";//这种过滤器是在端点请求完毕,返回结果或者发生异常后执行的filter。如果需要对返回的结果进行再次处理,可以在这种过滤中处理逻辑。 * PRE_TYPE = "pre"; //在zuul网关按照规则路由到下级服务之前执行,如果需要对请求进行预处理,可以使用这种类型的过滤器。如:认证鉴权,限流等。 * ROUTE_TYPE = "route";//这种过滤器是zuul路由动作的执行者,是Apache HttpClient或Ribbon构建和发送原始HTTP请求的地方,现在也支持OKHTTP。 * </pre> * * @return */ @Override public String filterType() { return PRE_TYPE; } /** * 设置filter的执行顺序,数字越小,优先级越高,反之越低 * * @return */ @Override public int filterOrder() { return 3; } /** * 是否执行该过滤器,可以作为一个开关,如果一直都被执行,直接返回true即可 * * @return */ @Override public boolean shouldFilter() { RequestContext ctx = RequestContext.getCurrentContext(); //从上下文获取logic-is-success值,用于判断此Filter是否执行 return (boolean) ctx.get("logic-is-success"); } /** * 该自定义filter的业务逻辑 * * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { 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; } }
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.*; public class PostFilter extends ZuulFilter { @Override public String filterType() { return POST_TYPE; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { System.out.println("这是PostFilter!"); //从RequestContext获取上下文 RequestContext ctx = RequestContext.getCurrentContext(); //处理返回中文乱码 ctx.getResponse().setCharacterEncoding("UTF-8"); //获取上下文中保存的responseBody String responseBody = ctx.getResponseBody(); //如果responseBody不为空,则说明流程有异常发生 if (null != responseBody) { //设定返回状态码 ctx.setResponseStatusCode(500); //替换响应报文 ctx.setResponseBody(responseBody); } return null; } }
原文链接:https://www.cnblogs.com/idoljames/p/11743058.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 500 ZuulException: Forwarding error 2020-06-01
- JAVA自定义注解 2020-06-01
- 自定义ClassLoader 2020-05-28
- 自定义持久层框架设计实现思路 2020-05-27
- 自定义Spring Boot starter 2020-05-25
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash