自定义网关过滤器

举报
小小张自由--张有博 发表于 2022/03/24 20:14:32 2022/03/24
【摘要】 自定义网关过滤器

过滤器就是在请求的传递过程中,对请求和响应做一些修改

客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端。

pre: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现参数校验、权限校验、流量监控、日志输出、协议转换等;

post:这种过滤器在路由到达微服务以后执行。这种过滤器可用做响应内容、响应头的修改,日志的输出,流量监控等。

只需要记住四个功能:


1.给过滤器命名。
2.过滤器执行顺序。
3.是否开启过滤器?
4.过滤器执行方法。

业务代码


配合的白名单

leyou:
  filter:
    allowPaths:
      - /api/auth
      - /api/search
      - /api/user/register
      - /api/user/check
      - /api/user/code
      - /api/item


过滤器的代码

@Component
@EnableConfigurationProperties(JwtProperties.class)
//要继承ZuulFilter类
public class LoginFilter extends ZuulFilter {
    //自定义的配置类
    @Autowired
    private JwtProperties properties;
    
    /**
     * 返回四种类型:
     * pre pre-routing过滤,路由前过滤
     * routing 在路由请求时被调用
     * post routing和error过滤器之后被调用
     * error 处理请求发生错误的时候调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }
    
     //过滤器执行顺序。
    @Override
    public int filterOrder() {
        return 5;
    }
    
    //是否开启过滤器
    //做接口白名单的过滤
    @Override
    public boolean shouldFilter() {
        // 获取上下文
        RequestContext ctx = RequestContext.getCurrentContext();
        // 获取request
        HttpServletRequest req = ctx.getRequest();
        // 获取路径
        String requestURI = req.getRequestURI();
        // 判断白名单
        // 遍历允许访问的路径
        for (String path : this.filterProp.getAllowPaths()) {
            // 然后判断是否是符合
            if(requestURI.startsWith(path)){
                return false;
            }
        }
        return true;
    }
 
    //业务方法验证token
    @Override
    public Object run() throws ZuulException {
        // 获取上下文
        RequestContext ctx = RequestContext.getCurrentContext();
        // 获取request
        HttpServletRequest request = ctx.getRequest();
        // 获取token
        String token = CookieUtils.getCookieValue(request, jwtProp.getCookieName());
        // 校验
        try {
            // 校验通过什么都不做,即放行
            JwtUtils.getInfoFromToken(token, jwtProp.getPublicKey());
        } catch (Exception e) {
            // 校验出现异常,返回403
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(403);
            logger.error("非法访问,未登录,地址:{}", request.getRemoteHost(), e );
        }
        return null;
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。