ZuulFilter
在服务网关中定义过滤器,只需要继承
ZuulFilter抽象类,实现其定义的四个抽象函数,就可对请求进行拦截与过滤
过滤器两个功能:
- 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础
- 过滤器功能则负责对请求的处理过程进行预干预,是实现请求校验、服务聚合等功能的基础
请求生命周期
- pre :在请求路由到目标之前执行。一般用于请求认证、负载均衡和日志记录
- route :在路由请求时候被调用,处理目标请求
- post :在route和error过滤器之后被调用,一般会在此步骤添加响应头、收集统计和性能数据等
- 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的更多相关文章
- Spring Cloud Zuul 添加 ZuulFilter
紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...
- ZuulFilter 执行顺序
说明: 创建了两个Filter,分别是 PreFilter public class PreFilter extends ZuulFilter { public PreFilter() { super ...
- springcloud zuulfilter 实现get,post请求日志记录功能
import com.alibaba.fastjson.JSONObject; import com.idoipo.infras.gateway.open.model.InvokeLogModel; ...
- springcloud zuul 使用zuulfilter 修改请求路径和响应头
最近做项目有一个需求:一个网盘系统,文件存放在分布式文件系统中,之前的文件下载统一走的文件下载服务,现在需要在单文件下载的时候不需要走文件下载服务,而是直接访问文件系统上的路径,响应的时候修改响应头, ...
- Spring Cloud之ZuulFilter拦截请求参数
过滤器放到网关: package com.toov5.filter; import javax.servlet.http.HttpServletRequest; import org.apache.c ...
- Zuul整合Swagger,使用ZuulFilter解决下游服务context-path
问题起因:使用Zuul网关服务,需要整合下游系统的swagger,但是下游服务存在context-path配置,无法正确跳转,最后使用ZuulFilter解决. 1.Zuul整合下游swagger 首 ...
- 服务网关ZuulFilter过滤器--pre/post/error的用法(校验请求信息,获取路由后的请求/响应信息,处理服务网关异常)
微服务中Zuul服务网关一共定义了四种类型的过滤器: pre:在请求被路由(转发)之前调用 route:在路由(请求)转发时被调用 error:服务网关发生异常时被调用 post:在路由(转发)请求后 ...
- ZuulServlet源码分析及ZuulFilter加载
参考https://yq.aliyun.com/wenji/2...https://blog.csdn.net/lds2227... 1.声明ZuulServlet @Configuration @E ...
- Spring Cloud Zuul之ZuulFilter详解
简介 Spring Cloud Zuul网关在整个微服务体系中肩负对外开放接口.请求拦截.路由转发等作用,其核心处理则是ZuulFilter ZuulFilter部分源码 Zuul Filter全部继 ...
随机推荐
- Dubbo多注册中心和Zookeeper服务的迁移
一.Dubbo多注册中心 1. 应用场景 例如阿里有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心. consumer.xml <?xm ...
- 2018-2-13-win10-uwp-如何拖动一个TextBlock的文字到另一个TextBlock-
title author date CreateTime categories win10 uwp 如何拖动一个TextBlock的文字到另一个TextBlock lindexi 2018-2-13 ...
- mimikaz获取明文密码
一.windows2008以上不保存明文密码解决办法 mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords& ...
- 继续搞我的linux
小程序研发已经告一段落,还是继续我的Linux研究.上次因为捣鼓那个fastab,结果吧虚拟机搞崩溃了.好吧,这次老子来装正式机,从机房拉来了一台破烂货,联想的老式服务器,开工吧. 用UltraISO ...
- zero udp
Description UDP transport can only be used with the ZMQ_RADIO and ZMQ_DISH socket types.
- bootstrapValidator--表单校验
关于表单校验 要依次引入 <link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css"& ...
- C/C++ 表达式
== ; std::cout << b<< std::endl; EX
- 【转载】WebRTC基于GCC的拥塞控制(上) - 算法分析
实时流媒体应用的最大特点是实时性,而延迟是实时性的最大敌人.从媒体收发端来讲,媒体数据的处理速度是造成延迟的重要原因:而从传输角度来讲,网络拥塞则是造成延迟的最主要原因.网络拥塞可能造成数据包丢失,也 ...
- 求最长的任意两元素差不超过M的子段——双指针+单调队列hdu4123
换根dp的部分比较容易,难点在于求求最长的任意两元素差不超过M的子段 首先会想到双指针维护(尺取法),如果p1,p2间的max-min>M,那么p1向右移动,直到p1,p2间的max-min&g ...
- NX二次开发-遍历当前part所有component,把装配子部件设置成工作部件
NX11+VS2013 #include <uf.h> #include <uf_disp.h> #include <uf_modl.h> #include < ...