服务网关第一步,自定义ZuulFilter 比眉伴天荒 2022-11-29 13:27 90阅读 0赞 直接撸代码 public class AccessFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(AccessFilter.class); @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); log.info(String.format("%s request to %s", request.getMethod(), request.get RequestURL().toString())); Object accessToken = request.getParameter("accessToken"); if(accessToken == null) { log.warn("access token is empty"); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); return null; } log.info("access token ok"); return null; } } **定义过滤器的实现,需要继承 ZuulFilter ,需要重写实现下面四个方法:** **1.filterType :** 返回一个字符串代表过滤器的类型,在zuul中定义了四种不同⽣命周期的过滤器 类型,具体如下: pre :可以在请求被路由之前调用 routing :在路由请求时候被调 post :在routing和error过滤器之后被调用 error :处理请求时发生错误时被调用 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MDI1MjE5_size_16_color_FFFFFF_t_70_pic_center] **2.filterOrder :** 通过int值来定义过滤器的执行顺序 **3.shouldFilter :** 返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤 器的开关。 在上例中,我们直接返回true,所以该过滤器总是有效。 **4.run :** 过滤器的具体逻辑。需要注意,这里我们通过 ctx.setSendZuulResponse(false) 令zuul 过滤该请求,不对其进行路由,然后通过 ctx.setResponseStatusCode(401) 设置了其返回的错 误码,当然我们也可以进⼀步优化我们的返回,比如,通过 ctx.setResponseBody(body) 对返 回body内容进行编辑等 在实现了自定义过滤器之后,还需要实例化该过滤器才能生效,我们只需要在应用主类中增加如下内容: @EnableZuulProxy @SpringCloudApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } @Bean public AccessFilter accessFilter() { return new AccessFilter(); } } [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MDI1MjE5_size_16_color_FFFFFF_t_70_pic_center]: /images/20221124/d14ccd8dbd524bc4a15d514157f3293b.png
还没有评论,来说两句吧...