Zuul提供一个框架,可以对Groovy写的过滤器进行动态的加载、编译、运行。过滤器之间没有直接的相互通信,通过一个RequestContext的静态类中ThreadLocal变量来进行数据传递,过滤器类型:
- PRE:这种过滤器在请求到达Origin Server之前调用。比如身份验证,在集群中选择请求的Origin Server,记log等;
- ROUTING:在这种过滤器中把用户请求发送给Origin Server。发送给Origin Server的用户请求在这类过滤器中build。并使用Apache HttpClient或者NetfilxRibbon发送给Origin Server;
- POST:这种过滤器在用户请求从Origin Server返回以后执行。比如在返回的response上面加response header,做各种统计等。并在该过滤器中把response返回给客户;
- ERROR:在其他阶段发生错误时执行该过滤器;
- 客户定制:比如我们可以定制一种STATIC类型的过滤器,用来模拟生成返回给客户的response;
- 创建过滤器 TokenFilter 继承 ZuulFilter
public class TokenFilter extends ZuulFilter {
/**
* 四种类型:pre,routing,error,post
* pre:主要用在路由映射的阶段是寻找路由映射表的
* routing:具体的路由转发过滤器是在routing路由器,具体的请求转发的时候会调用
* error:一旦前面的过滤器出错了,会调用error过滤器。
* post:当routing,error运行完后才会调用该过滤器,是在最后阶段的
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 自定义过滤器执行的顺序,数值越大越靠后执行,越小就越先执行
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 控制过滤器生效不生效,可以在里面写一串逻辑来控制
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 执行过滤逻辑
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
if (token == null){
context.setSendZuulResponse(false);
context.setResponseStatusCode(401);
context.setResponseBody("unAuthrized");
return null;
}
return null;
}
}
- 将过滤器 TokenFilter 注入到spring 容器中
@SpringBootApplication
@EnableZuulProxy
public class SpringCloudZuulApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudZuulApplication.class, args);
}
@Bean
public TokenFilter tokenFilter(){
return new TokenFilter();
}
}
- 启动项目开始测试