要给请求头加入一个 header 需要在ctx.addZuulRequestHreader("","")(上面代码中的 RequestContext 是 zuul 重写的,在其中加入了一些方法)方法中操作,zuul 会在发出请求是把 header 加到请求头中。(因为 Zuul 本质是一个代理,它截取请求,然后自己再发送这个请求,所有不能也没有必要在原来的 request 上加 header。
重启项目 Zuul,访问localhost:5555/apis/licensestatic/licensing/12,可以看到控制台有如下打印:
说明前置过滤器生效。
现在从 zuul 服务网关发往许可证服务的 http 请求已经携带了 id。
b、后置过滤器后置过滤器通常用于进行敏感信息过滤和响应记录。这里我们实现一个后置过滤器,将许可证服务请求的响应内容打印到控制台上同时把idheader 插入到服务客户端请求的 response 中。
@Component public class ResponseFilter extends ZuulFilter { private static final Logger LOGGER = LoggerFactory.getLogger(ResponseFilter.class); /** * 返回过滤器类型 ;pre:前置过滤器。post:后置过滤器。routing:路由过滤器。error:错误过滤器 */ @Override public String filterType() { return "post"; } /** * 过滤器执行顺序 */ @Override public int filterOrder() { return 1; } /** * 是否启动此过滤器 */ @Override public boolean shouldFilter() { return true; } @Override public Object run(){ RequestContext ctx = RequestContext.getCurrentContext(); String id = ctx.getZuulRequestHeaders().get("id"); ctx.getResponse().addHeader("id", id); try { BufferedReader reader = new BufferedReader(new InputStreamReader(ctx.getResponseDataStream())); String response = reader.readLine(); LOGGER.info("响应为:{}", response); //写到输出流中,本来可以由zuul框架来操作,但是我们已经读取了输入流,zuul读不到数据了,所以要手动写响应到response ctx.getResponse().setHeader("Content-Type","application/json;charset=utf-8"); ctx.getResponse().getWriter().write(response); } catch (Exception e) { } return null; } }经过这样一波操作,就能达到目的了。访问:localhost:5555/apis/licensestatic/licensing/12。控制台打印如下:
请求响应如下:
c、路由过滤器路由过滤器用起来有点复杂,这里不写具体的实际代码,只是写一个思路。具体代码可以参考spring 微服务
获取当前请求路径
判断是否需要进行特殊路由
如需要进行特殊路由,在此进行 http 调用
将 http 调用的 response 写入到当前请求的 response 中
结束终于写完了,微服务的基础学习又近了一步,加油!
本篇代码存放于:github
本篇原创发布于:FleyX 的个人博客