上篇博客介绍了如何实现zuul,现在介绍下它的过滤器功能!
这里介绍两个:pre和post
1.pre
我要实现:访问一个接口,必须要加上token的参数,如果有的话才可以访问,没有的话就无权访问。
源代码:
package van.gateway.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
/**
* @author Van
* @date 2020/4/11 - 20:19
*/
@Component
public class PreFilter extends ZuulFilter {
@Override
public String filterType() {
return PRE_TYPE;//这里用的是前置filter
}
@Override
public int filterOrder() {
return PRE_DECORATION_FILTER_ORDER-1;//PRE类型的filter里面也有很多种类的filter,这里用的是这种。数值越小优先级越高
}
@Override
public boolean shouldFilter() {
return true;//是否执行该过滤器,true 为执行,false 为不执行,这个也可以利用配置中心来实现,达到动态的开启和关闭过滤器。
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext=RequestContext.getCurrentContext();
HttpServletRequest request=requestContext.getRequest();
String token=request.getParameter("token");
if (StringUtils.isEmpty(token)){
requestContext.setSendZuulResponse(false);//访问不通过
requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
}
return null;
}
}
这里要注意的几个地方:
1.一定要加上@Component注解,交给spring管理,不然这个filter不起作用!
2.filter order这里,每一个类型的过滤器都有一组过滤器,并且越小优先级越高,一般pre都是放在PRE_DECORATION_FILTER_ORDER 过滤器之前的。固定搭配了
如果不加:401是无权限
2.post:
这里我要在response还没有到达客户端的时候,我在response headers中加
hello:van
package van.gateway.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SEND_RESPONSE_FILTER_ORDER;
/**
* @author Van
* @date 2020/4/11 - 20:42
*/
@Component
public class PostFilter extends ZuulFilter {
@Override
public String filterType() {
return POST_TYPE;
}
@Override
public int filterOrder() {
return SEND_RESPONSE_FILTER_ORDER-1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext=RequestContext.getCurrentContext();
HttpServletResponse response=requestContext.getResponse();
response.setHeader("hello","van");
return null;
}
}
当然post的固定搭配就是在SEND_RESPONSE_FILTER_ORDER过滤器的前面