一.基础知识
Spring Cloud中默认已经为Zuul编写并启用了一些过滤器,这些过滤器都在spring-cloud-netflix-zuul这个Jar包的org.springframework.cloud.netflix.zuul.filters包中。
要实现Zuul的过滤器,就需要继承ZuulFilter的父类,实现filterType()、filterOrder()、shouldFilter()以及run()方法
(1)filterType()方法为获取该过滤器的类型。
通过“FilterConstants”类中的Type常量,我们可以知晓,Zuul的标准过滤器一共有“error”、“post”、“pre”和“route”的类型:
①PRE:这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择请求的微服务,记录调试信息等。
②ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache?HttpClient或Netflix?Ribbon请求微服务。
③POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP header、收集统计信息和指标、将响应从微服务发送给客户端等。
④ERROR:在其他阶段发送错误时执行该过滤器。
(2)filterOrder()方法为获取过滤器在责任链中的顺序,其中数值越大,越后执行;
这里各个filter之间不直接进行交互,而是通过RequestContext来共享状态信息。
(3)shouldFilter()方法获取是否需要执行该过滤;
(4)run()方法就是该过滤器的具体过滤逻辑的执行。
总结:如果我们要自定义Zuul的Filter过滤器,继承ZuulFilter父类,并实现以上四个方法即可。Zuul会动态的读取,编译,运行新添加的filter。
二、编写Zuul的自定义过滤器
实现要求:查询如果是输入id,则正确通过,如果查实输入的是字符china,则过滤掉,不让其通过。
修改项目:ms-zuul-consumer在项目中新增一个过滤器
1.ChineseCharacterFilter过滤器:
package com.ljf.weifuwu.springcloud.zuul.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletRequest;
public class ChineseCharacterFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";//类型为p
}
@Override
public int filterOrder() {
return 1;//过滤器排序为1号
}
/**
* 判断是否执行该过滤器
* @return
*/
@Override
public boolean shouldFilter() {
return true;//执行该过滤器
}
@Override
public Object run() {
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
String URI = request.getRequestURI();
if(URI.contains("/eureka-provider/")) {
//获取RESTful风格请求URI"/user/findById/1" 中的“1"
String userName = URI.split("/")[3];
if(!StringUtils.isEmpty(userName)&&"china".equals(userName)) {
System.out.println("请求了UserId为"+userName+"的用户,有风险!!!");
}else {
System.out.println("请求了UserId不为china的用户,无风险~~");
}
}
return null;
}
}
2.在启动类注册该类的实例bean:
/**
* 返回bean
* @return
*/
@Bean
public ChineseCharacterFilter riskCheckFilter() {
return new ChineseCharacterFilter();
}
3.启动服务:ms-eureka-center(8761)、ms-eureka-provider(7901)、ms-zuul-consumer(8008)
4.访问:
http://localhost:8008/user-zuul/eureka-provider/1
http://localhost:8008/user-zuul/eureka-provider/china
三、禁用Zuul的Filter过滤器
需要对Zuul的某些过滤器进行禁用,我们只需要在配置文件中,通过以下格式来禁用某个过滤器即可:
zuul.<SimpleClassName>.<filterType>.disable=true
如本案例:zuul.ChineseCharacterFilter.pre.disable=ture
注意:标红的部分,需要根据情况动态调整。