5Zuul 过滤器 · SpringCloud微服务实战 · 看云
5. Zuul 过滤器
导航
本节代码地址
GitHub: https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-gateways/fw-cloud-gateways-zuul-simple
GitHub: https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-ribbon/fw-cloud-ribbon-server
Zuul作为网关来说,会做很多转发前的校验,而这些校验我们都可以基于Zuul过滤器来实现,比如Token校验、IP黑名单等。
5.1 新建过滤器
通过模拟用户必须携带token,来拦截用户的请求。前面我们说过Zuul 的生命周期,我们这里模拟在Header里面需要携带token,并且token 的值必须为123456,否则就会执行失败。
public class TokenFilter extends ZuulFilter {
@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();
String token = request.getHeader("token");
if (StringUtils.isNotBlank(token) && token.equals("123456")) {
ctx.setSendZuulResponse(true);
ctx.setResponseStatusCode(200);
ctx.set("code", 1);
} else {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
HttpServletResponse response = ctx.getResponse();
response.setHeader("content-type", "text/html;charset=utf8");
ctx.setResponseBody("认证失败");
ctx.set("code", 0);
}
return null;
}
}
自定义过滤器需要继承ZuulFilter , 并且需要实现下面几个方法:
• shou ldFilter : 是否执行该过滤器, true 为执行, false 为不执行,可以结合配置中心及结合业务逻辑设置
• filterType :过滤器类型,pre 、route 、post 、error 。
• filterOrder :过滤器的执行顺序,数值越小,优先级越高。
• run :执行自己的业务逻辑。设置的ctx.setSendZuulResponse(false); 代表不对其进行路由,ctx.setSendZuulResponse(true);表示对请求进行路由。
5.3 配置过滤器
@Configuration
public class ZuulConfig {
@Bean
public TokenFilter tokenFilter(){
return new TokenFilter();
}
}
5.4 重启应用
浏览器或Postman 输入localhost:8679/ribbon/user/1
首先未设置token
设置token

