您的位置:首页 > 编程语言 > Java开发

spring cloud 使用 Zuul实现过滤器

2018-01-24 09:08 435 查看

Zuul实现过滤器

Zuul

Netflix zuul作为API网关集成在spring cloud分布式集群中,是一个智能的应用服务器,对外暴露分布式中的请求调度和过滤,实现请求路由、负载均衡、与服务治理框架整合、请求转发的熔断机制和服务聚合等功能。

过滤器类型:

PRE:请求被路由之前被调用,身份验证

ROUTING:将请求路由到微服务。

POST:路由到微服务之后执行

ERROR:在其他阶段发生错误时执行。

编写zuul过滤器

public class LogFilter extends ZuulFilter {
private static final Logger LOGGER = LogFilter.getLogger(PreRequestLogFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
LogFilter.LOGGER.info(String.format("send %s request to %s", request.getMethod(), request.getRequestURL().toString()));
return null;
}
}


zuul实现filter的方法:

filterType:返回过滤器的类型:pre、route、post、error

filterOrder:返回int值,来确定filter的执行顺序,不同的过滤器允许返回相同的数字

shouldFilter:返回boolean确定filter是否执行

run:过滤器执行内容

在启动类中注册过滤器

@Bean
public LogFilter logFilter() {
return new LogFilter();
}


禁用过滤器,在配置文件中添加:

zuul.<SimpleClassName>.<filterType>.disable = true


用户权限验证失败不进行路由:

@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
request.getMethod(), request.getRequestURL().toString()));
String token = request.getHeader("token");
if (!ifRight(token)){
//认证失败
logger.error("token验证失败");
HttpServletResponse response = ctx.getResponse();
response.setCharacterEncoding("utf-8");  //设置字符集
response.setContentType("text/html; charset=utf-8"); //设置相应格式
response.setStatus(401);
ctx.setSendZuulResponse(false); //不进行路由
try {
response.getWriter().write("token 验证失败"); //响应体
} catch (IOException e) {
loger.error("response io异常")
e.printStackTrace();
}
ctx.setResponse(response);
return null;
}
logger.info("token验证成功");
return null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息