5.2 Zuul的过滤功能
三.过滤器
Zuul作为网关的一个重要功能,就是实现请求的鉴权。而这个动作我们往往通过Zuul提供的过滤器来实现。
1. ZuulFilter
ZuulFilter是过滤器的顶级父类。其中定义的4个最重要的方法:
public abstract ZuulFilter implements IZuulFilter{
abstract public String filterType();
abstract public int filterOrder();
boolean shouldFilter();//IZuulFilter
Object run() throws ZuulException;//IZuulFilter
}
- shouldFilter: 返回一个boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
- run: 过滤器的具体业务逻辑
- filterType:返回字符串,代表过滤器的类型,包含以下4种:
pre:请求在路由前被执行
route:在路由请求时调用
post
error - filterOrder: 控制过滤器顺序
2.过滤器执行生命周期
截图来自Zuul官网
3.编写过滤器(以登陆过滤器为例)
继承ZuulFilter抽象类,并实现4个方法:
zuul包下建立filter包->LoginFilter.java
package com.zuul.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class LoginFilter extends ZuulFilter {
/**
*过滤器类型: pre routr post error
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 执行顺序,返回值越小,优先级越高
* @return
*/
@Override
public int filterOrder() {
return 10;
}
/**
* 是否执行run方法
* true-执行run
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 编写过滤器的业务逻辑
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
//初始化context上下文对象
RequestContext context = RequestContext.getCurrentContext();
//获取request对象
HttpServletRequest request = context.getRequest();
//获取参数
String token = request.getParameter("token");
if(StringUtils.isBlank(token)){
//拦截,不转发请求
context.setSendZuulResponse(false);
// 发送状态码401-身份未认证
context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
//设置响应的提示
context.setResponseBody("request error!");
}
//返回值null,过滤器什么都不做
return null;
}
}
访问 :
http://localhost:8010/service-provider/user/get/1?token=xx
成功。
去掉token并访问
http://localhost:8010/service-provider/user/get/1
访问失败,显示如下: