zuul过滤器实现很简单,只要集成ZuulFilter,实现其中的抽象方法即可。
在moudle zuul-cloud-client中添加自定义过滤器类,本例实现网关过滤是否有token参数:
@Component
public class Myfilter extends ZuulFilter {
@Override
public String filterType() {
//过滤器又四种类型:pre、post、routing、error
return "pre";
}
@Override
public int filterOrder() {
//过滤顺序,值越小,越早执行
return 0;
}
@Override
public boolean shouldFilter() {
//是否过滤逻辑,如果为true则执行 run方法,否则不执行。
return true;
}
@Override
public Object run() {
System.out.println("========过滤器=====");
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object objToken = request.getParameter("token");
if(objToken==null){
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try{
ctx.getResponse().getWriter().write("token is empty!");
}catch (Exception e){
System.out.println("=========输出异常=====");
return null ;
}
}
return null;
}
}
重新启动项目,在浏览器输入: http://localhost:9000/v1/ribbonapi/hello
会看到过滤器已经起了作用,拦截了我们的请求: