zuul过滤器:快速实现

这篇博客挺不错,深入了解可以看看

上篇博客介绍了如何实现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过滤器的前面

发布了63 篇原创文章 · 获赞 1 · 访问量 1749

猜你喜欢

转载自blog.csdn.net/weixin_44841849/article/details/105593612