在服务网关中定义过滤器,只需要继承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. 从可变长函数到legb

    可变长参数 * *形参 用元组接收接收多余的位置实参 约定俗成形参名为 *args def f1(*args):#调用函数时,有多少个参数我就接收多少个 res = 0 for num in args ...

  2. form编码方式application/x-www-form-urlencoded和multipart/form-data的区别?

    application/x-www-form-urlencoded: 表单数据编码为键值对,&分隔 multipart/form-data: 表单数据编码为一条消息,每个控件对应消息的一部分 ...

  3. c# 使用NOPI 操作Excel

    最近项目需要导出Excel,找来找去,微软有自己的Excel组件 using Microsoft.Office.Core;using Microsoft.Office.Interop.Excel;,但 ...

  4. 前端 css 补充内容

    给个菜鸟教程的css教程网址(全的狠!!!): https://www.runoob.com/css/css-tutorial.html 下面是几张css基础样式图:

  5. node 模板引擎使用的步奏

    //定义模板引擎 app.engine('html',swig.renderFile);//设置模板引擎所存放的位置app.set('views','/views');//注册所使用的模板引擎app. ...

  6. Linux下安装.NETCore3.0

    今天把.NETCore从2.2升到3.0记录一下 Download .NET Core 3.0  :https://dotnet.microsoft.com/download/dotnet-core/ ...

  7. redis安装到本地服务的方法

    要安装Redis,首先要获取安装包. Windows的Redis安装包需要到以下GitHub链接找到. 链接:https://github.com/MSOpenTech/redis 打开网站后,找到R ...

  8. [转]Netty入门(最简单的Netty客户端/服务器程序)

    Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...

  9. 关于scroll、client、offset和style中的height、width、top以及bottom属性

    内容和图片来自offset.scroll.client三大家族, 此处仅作记录使用 client offset scroll

  10. FFT最新卡常研究

    指针优化并没有什么卵用,反而增大了代码的不可读性. 除了本来的循环顺序优化寻址,在预处理单位复数根时,可以连续存储,以增快寻址速度,细节见代码. 代码给出的是FFT,NTT是一样的. #include ...