1.新建一个LoginFilter类,我们来自定义一个zuul的登录拦截过滤器:
- 目录结构:
- LoginFilter代码:
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 route 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上下文对象,servlet spring
RequestContext context = RequestContext.getCurrentContext();
//获取request对象
HttpServletRequest request = context.getRequest();
//获取参数
String token = request.getParameter("token");
if(StringUtils.isBlank(token)){ //如果token为空
//拦截
context.setSendZuulResponse(false);
//响应状态码,401身份未认证
context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
context.setResponseBody("request error!");
}
//返回值为null,代表该过滤器什么都不做
return null;
}
}
2.详解:
首先新建类之后继承ZuulFilter类,并重写如下四个方法:
- (1)filterType方法
/**
* 过滤器的类型:pre route post error
* @return
*/
@Override
public String filterType() {
return "pre";
}
return返回的值为该过滤器的类型:
- pre类型:这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择请求的微服务,记录调试信息等。
- routing类型:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netflix Ribbon请求微服务。
- post类型:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP header、收集统计信息和指标、将响应从微服务发送给客户端等。
- error类型:在其他阶段发送错误时执行该过滤器。
- (2)filterOrder方法:
/**
* 执行顺序,返回值越小,优先级越高
* @return
*/
@Override
public int filterOrder() {
return 10;
}
-
(3)shouldFilter方法:
是否执行run方法(true,false)。
@Override
public boolean shouldFilter() {
return true;
}
-
(4) run方法:
编写业务逻辑。
@Override
public Object run() throws ZuulException {
//初始化context上下文对象,servlet spring
RequestContext context = RequestContext.getCurrentContext();
//获取request对象
HttpServletRequest request = context.getRequest();
//获取参数
String token = request.getParameter("token");
if(StringUtils.isBlank(token)){ //如果token为空
//拦截
context.setSendZuulResponse(false);
//响应状态码,401身份未认证
context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
context.setResponseBody("request error!");
}
//返回值为null,代表该过滤器什么都不做
return null;
}
3.测试代码:
- 没有传token时:
- 传token时: 成功拉取服务。