在服务网关中定义过滤器,只需要继承ZuulFilter抽象类,实现其定义的四个抽象函数,就可对请求进行拦截与过滤

过滤器两个功能:

  1. 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础
  2. 过滤器功能则负责对请求的处理过程进行预干预,是实现请求校验、服务聚合等功能的基础

请求生命周期

  1. pre :在请求路由到目标之前执行。一般用于请求认证、负载均衡和日志记录
  2. route :在路由请求时候被调用,处理目标请求
  3. post :在route和error过滤器之后被调用,一般会在此步骤添加响应头、收集统计和性能数据等
  4. error :处理请求时发生错误时被调用

第一阶段:pre类型的过滤器处理

第二个阶段:routing,路由请求转发阶段
请求将会被routing类型过滤器处理,这里的具体处理内容就是将外部请求转发到具体服务实例上去的过程
当服务实例将请求结果都返回之后,routing阶段完成 第三个阶段:post,此时请求将会被post类型的过滤器进行处理
这些过滤器在处理的时候不仅可以获取到请求信息,还能获取到服务实例的返回信息,
所以在post类型的过滤器中,我们可以对处理结果进行一些加工或转换等内容。 一个特殊的阶段:error,该阶段只有在上述三个阶段中发生异常的时候才会触发
但是它的最后流向还是post类型的过滤器,因为它需要通过post过滤器将最终结果返回给请求客户端

网站前台的token转发(经过网关,头信息会丢失)

@Component
public class WebFilter extends ZuulFilter {
/**
* pre :在请求路由到目标之前执行。一般用于请求认证、负载均衡和日志记录
* route :在路由请求时候被调用,处理目标请求
* post :在route和error过滤器之后被调用,一般会在此步骤添加响应头、收集统计和性能数据等
* error :处理请求时发生错误时被调用
*/
@Override
public String filterType() {
return "pre"; //"pre"代表前置过滤器
} @Override
public int filterOrder() {
return 0; //通过int值来定义过滤器的执行顺序,优先级为0,数字越大,优先级越低
} @Override
public boolean shouldFilter() {
return true; //执行过滤器的条件,开启过滤器
} @Override
public Object run() throws ZuulException { //过滤器的具体逻辑
//向header中添加鉴权令牌
RequestContext requestContext = RequestContext.getCurrentContext();
//获取header
HttpServletRequest request = requestContext.getRequest();
String authorization = request.getHeader("Authorization");
if (authorization != null) {
requestContext.addZuulRequestHeader("Authorization", authorization);
}
return null;
}
}

管理后台过滤器实现token校验

public class WebFilter extends ZuulFilter {

    @Autowired
private JwtUtil jwtUtil; @Override
public String filterType() {
return "pre"; //"pre"代表前置过滤器
} @Override
public int filterOrder() {
return 0; //通过int值来定义过滤器的执行顺序,优先级为0,数字越大,优先级越低
} @Override
public boolean shouldFilter() {
return true; //开启过滤器
} @Override
public Object run() throws ZuulException { //过滤器的具体逻辑
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest(); if (request.getMethod().equals("OPTIONS")) return null; //网关转发内部请求,直接放行
if (request.getRequestURI().indexOf("login") > 0) return null; //登陆放行 String authHeader = request.getHeader("Authorization"); //获取头信息
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7); //获取Token
Claims claims = jwtUtil.parseJWT(token); //解析Token
if (claims != null) {
if ("admin".equals(claims.get("roles"))) {
requestContext.addZuulRequestHeader("Authorization", authHeader);
System.out.println("token 验证通过,添加了头信息" + authHeader);
return null;
}
}
} /**
* 通过 requestContext.setSendZuulResponse(false) 令zuul过滤该请求,不对其进行路由
* 通过 requestContext.setResponseStatusCode(403) 设置了其返回的错误码
*/
requestContext.setSendZuulResponse(false); //终止运行
requestContext.setResponseStatusCode(403); //http状态码
requestContext.setResponseBody("权限不足"); requestContext.getResponse().setContentType("text/html;charset=UTF‐8");
return null;
}
}

ZuulFilter的更多相关文章

  1. Spring Cloud Zuul 添加 ZuulFilter

    紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...

  2. ZuulFilter 执行顺序

    说明: 创建了两个Filter,分别是 PreFilter public class PreFilter extends ZuulFilter { public PreFilter() { super ...

  3. springcloud zuulfilter 实现get,post请求日志记录功能

    import com.alibaba.fastjson.JSONObject; import com.idoipo.infras.gateway.open.model.InvokeLogModel; ...

  4. springcloud zuul 使用zuulfilter 修改请求路径和响应头

    最近做项目有一个需求:一个网盘系统,文件存放在分布式文件系统中,之前的文件下载统一走的文件下载服务,现在需要在单文件下载的时候不需要走文件下载服务,而是直接访问文件系统上的路径,响应的时候修改响应头, ...

  5. Spring Cloud之ZuulFilter拦截请求参数

    过滤器放到网关: package com.toov5.filter; import javax.servlet.http.HttpServletRequest; import org.apache.c ...

  6. Zuul整合Swagger,使用ZuulFilter解决下游服务context-path

    问题起因:使用Zuul网关服务,需要整合下游系统的swagger,但是下游服务存在context-path配置,无法正确跳转,最后使用ZuulFilter解决. 1.Zuul整合下游swagger 首 ...

  7. 服务网关ZuulFilter过滤器--pre/post/error的用法(校验请求信息,获取路由后的请求/响应信息,处理服务网关异常)

    微服务中Zuul服务网关一共定义了四种类型的过滤器: pre:在请求被路由(转发)之前调用 route:在路由(请求)转发时被调用 error:服务网关发生异常时被调用 post:在路由(转发)请求后 ...

  8. ZuulServlet源码分析及ZuulFilter加载

    参考https://yq.aliyun.com/wenji/2...https://blog.csdn.net/lds2227... 1.声明ZuulServlet @Configuration @E ...

  9. Spring Cloud Zuul之ZuulFilter详解

    简介 Spring Cloud Zuul网关在整个微服务体系中肩负对外开放接口.请求拦截.路由转发等作用,其核心处理则是ZuulFilter ZuulFilter部分源码 Zuul Filter全部继 ...

随机推荐

  1. 2018年第九届蓝桥杯B组第四题:摔手机题解

    摔手机 摔手机 动态规划  在蓝桥杯的时候遇到一次 当时没有做对  看了题解也没明白  如今再次遇到这个类似的题目 于是拿出来补补吧 摔手机题目如下: 星球的居民脾气不太好,但好在他们生气的时候唯一的 ...

  2. Q:微信小程序一次性订阅消息(前台收集)

    说明:官方文档(https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.ht ...

  3. windows10 自动配置切换IP

    办公室与家里的ip网段不一样.每次都要来回修改本地无线WLAN IP段.写了个脚本bat,自动配置WLAN IP,方便切换. 建立 auto-set-ip.bat,保存格式需为ANSI,否则中文会乱码 ...

  4. 2、go 运行操作

    1)有且只有一个函数入口,main liteIDE,直接图形界面编译,一个文件夹里的只能有一个main函数 或者 go build XXX.go 编译go代码,生成一个可执行程序 然后运行可执行程序 ...

  5. delphi directui 做界面的一个例子

    现在很多CS系统或者软件界面都做的非常好看,比如:QQ皮肤,迅雷下载,360杀毒界面等.这些都是运用的流行的DIRECTUI 技术,基本上有的资料都是基于C++的,很少有同仁将C++下的DIRECT ...

  6. NX二次开发-NXOPEN设置工程图表格注释字体workPart->Fonts()->AddFont("chinesef_fs", NXOpen::FontCollection::TypeNx);

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  7. JVM常用命令行工具1

    1.jps [options][hostid]:查看虚拟机进程状况 -l 输出主类全名,如果进程执行的是jar包,输出jar包路径.-q 只输出LVMID. -m输出虚拟机进程启动时传递给主类main ...

  8. Openstack nova-scheduler 源码分析 — Filters/Weighting

    目录 目录 前言 调度器 FilterScheduler调度器的工作流程 Filters 过滤器 Filters 类型 Weighting 权重 源码实现 关键文件及其意义 阶段一nova-sched ...

  9. RoadFlowCore 解决方案介绍及开发概述

    RoadFlow解决方案如下: RoadFlow.Business:业务层 RoadFlow.Integrate:组织机构获取层(如果你系统要使用第三方组织架构的时候修改这里面的方法即可) RoadF ...

  10. [转]关于tomcat 中的 tomcat-users.xml 配置不生效原因

    安装完tomcat,或者解压完tomcat后,在tomcat的目录下有个conf文件夹,在这个文件夹下面有一个tomcat- users.xml的文件,这个文件里面的配置信息是当我们进入http:// ...