Zuul不仅仅只是路由,还有很多强大的功能,此处实现它的服务过滤功能,比如用在安全验证方面。
创建服务过滤器
创建LoginFilter类继承ZuulFilter
,并在类上增加@Component
注解就可以使用服务过滤功能了,非常简单方便。
package com.springcloud.bh.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.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class LoginFilter extends ZuulFilter {
/**
* 返回一个字符串代表过滤器的类型,zuul中定义了4种不同生命周期的过滤器类型
* pre(路由之前), routing(路由之时) , post(路由之后), error(发生错误调用)
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤顺序
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 是否需要过滤
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器具体业务代码
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext currentContext=RequestContext.getCurrentContext();
HttpServletRequest request=currentContext.getRequest();
String token=request.getParameter("token");
if (StringUtils.isEmpty(token))
{
currentContext.setSendZuulResponse(false);
currentContext.setResponseStatusCode(401);
try {
HttpServletResponse response=currentContext.getResponse();
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("非法请求,请携带token参数后再尝试请求!");
}catch (Exception e)
{
e.printStackTrace();
System.err.println(e.getMessage());
}
}
return null;
}
}
方法说明
filterType
返回一个字符串代表过滤器的类型,在Zuul中定义了四种不同生命周期的过滤器类型
pre
: 路由之前routing
: 路由之时post
: 路由之后error
: 发送错误调用
filterOrder
过滤顺序
shouldFilter
是否需要过滤,这里是
true
,需要过滤。
run
过滤器的具体业务代码
测试过滤器
打开浏览器访问http://localhost:8766/api/b/hi?message=hi,Feign 网页显示
非法请求,请携带token参数后再尝试请求!
打开浏览器访问http://localhost:8766/api/b/hi?message=hi,Feign&token=123 网页显示
你的消息是:hi,Feign 端口号:8763
此时便成功实现了Zuul服务过滤功能。
源码地址
Github: https://github.com/yeshang5/springcloud-example