开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情 zuul的过滤器根据对HTTP请求的不同处理阶段包括如下四种类型
- pre :在请求转发到后端目标服务之前执行,一般用于请求认证、确定路由地址、日志记录等
- route :转发请求,使用Apache HttpClient 或 Ribbon来构造对目标服务的请求
- post :在目标服务返回结果后对结果进行处理,比如添加响应头、收集统计性能数据等
- error :在请求处理的整个流程中如果出现错误,则会触发error过滤器执行,对错误进行处理
1.新增filter包
2.定义AbstractZuulFilter抽象类
package com.imooc.coupon.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
/**
* @author ccuser
*/
public abstract class AbstractZuulFilter extends ZuulFilter {
RequestContext context;
private final static String NEXT = "next";
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
return (boolean) ctx.getOrDefault(NEXT,true);
}
@Override
public Object run() throws ZuulException {
context= RequestContext.getCurrentContext();
return cRun();
}
protected abstract Object cRun();
Object fail(int code ,String msg){
context.set(NEXT,false);
context.setSendZuulResponse(false);
context.getResponse().setContentType("text/html;charset=UTF-8");
context.setResponseStatusCode(code);
context.setResponseBody(String.format("{"result":"%s"}",msg));
return null;
}
Object success(){
context.set(NEXT,true);
return null;
}
}
代码说明:
- shouldFilter:表示该过滤器是否过滤逻辑,为true则执行run(),为false,则不执行。
- Object run():过滤器实际上执行的内容(即具体的过滤逻辑)
- protected abstract Object cRun(): 自定义过滤执行的逻辑
- Object fail:错误返回方法
- Object success: 成功返回方法
3.定义前置过滤器AbstractPreZuulFilter
public abstract class AbstractPreZuulFilter extends AbstractZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
}
代码说明:前置过滤器继承AbstractZuulFilter并且重写filterType方法
4.定义post过滤器AbstractPostZuulFilter
public abstract class AbstractPostZuulFilter extends AbstractZuulFilter {
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
}
代码说明:post过滤器继承AbstractZuulFilter并且重写filterType方法
4.自定义token过滤器
@Slf4j
@Component
public class TokenFilter extends AbstractPreZuulFilter {
@Override
protected Object cRun() {
HttpServletRequest request = context.getRequest();
log.info(String.format("%s request to %s",request.getMethod(),request.getRequestURL().toString()));
Object token = request.getParameter("token");
if(null == token){
log.error("error:token is empty");
return fail(401,"error:token is empty");
}
return success();
}
@Override
public int filterOrder() {
return 1;
}
}
代码说明:
- @Slf4j:注入日志依赖
- @Component:过滤器定义为组件
- Object cRun():过滤逻辑
- HttpServletRequest request = context.getRequest():获取请求对象
- Object token = request.getParameter("token"):获取token对象
- null == token判断token是否为空,如果为空,直接返回错误信息
- filterOrder:通过int值来定义过滤器的执行顺序,值越小,越早执行