Spring Cloud Zuul添加过滤器过程解析
作者:SongAlone 发布时间:2023-02-01 06:37:25
标签:spring,cloud,zuul,添加,过滤器
这篇文章主要介绍了Spring Cloud Zuul添加过滤器过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。
一、过滤器方法的作用
想要使用Zuul实现过滤功能,我们需要自定义一个类继承ZuulFilter类,并实现其中的四个方法,我们先看一下这四个方法的作用是什么
public class MyFilter extends ZuulFilter {
/**
* filterType:返回字符串,代表过滤器的类型。包含以下4种:
* -- pre:请求在被路由之前执行
* -- route:在路由请求时调用
* -- post:在route和errror过滤器之后调用
* -- error:处理请求时发生错误调用
* @return 返回以上四个类型的名称
*/
@Override
public String filterType() {
return null;
}
/**
* filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
* @return
*/
@Override
public boolean shouldFilter() {
return false;
}
/**
* run:编写过滤器的具体业务逻辑。
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
return null;
}
}
二、自定义过滤器
我这里以pre类型演示
@Component
public class LoginFilter extends ZuulFilter {
//过滤类型 pre route post error
@Override
public String filterType() {
return "pre";
}
//过滤优先级,数字越小优先级越高
@Override
public int filterOrder() {
return 10;
}
//是否执行run方法
@Override
public boolean shouldFilter() {
return true;
}
//过滤逻辑代码
@Override
public Object run() throws ZuulException {
//获取zuul提供的上下文对象
RequestContext context = RequestContext.getCurrentContext();
//获取request对象
HttpServletRequest request = context.getRequest();
//获取请求参数
String token = request.getParameter("username");
//判断
if (StringUtils.isBlank(username)){
//过滤该请求,不对其进行路由
context.setSendZuulResponse(false);
//设置响应码401
context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
//设置响应体
context.setResponseBody("request error....");
}
// 校验通过,把登陆信息放入上下文信息,继续向后执行
context.set("username",username);
return null;
}
}
没添加过滤功能之前是这样的 ↓,无论加不加username都可以得到数据
添加了过滤功能之后是这样的 ↓,只有加了username才能访问
F12打开控制台,发现响应了401
三、过滤器执行的声明周期
过滤器执行的声明周期
正常流程:
请求到达首先会经过pre类型过滤器,而后到达route类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
异常流程:
整个过程中,pre或者route过滤器出现异常,都会直接进入error过滤器,在error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
如果是error过滤器自己出现异常,最终也会进入POST过滤器,将最终结果返回给请求客户端。
如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和route不同的是,请求不会再到达POST过滤器了。
来源:https://www.cnblogs.com/songjilong/p/11976332.html


猜你喜欢
- 最新idea2020安装部署超详细教程懂得懂的2020.32020.2.42020.2.32020.2.220.2.12019.32018.
- 求数组中最大的数的值:1、数组的max函数:class Program { &nb
- 一、自己封装URLConnection 连接请求类 public void downloadFile1() { try{ &nb
- 现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向)。但有时我们的应用程序仅限在横屏或者竖
- 最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同
- 本文实例为大家分享了Flutter Drawer抽屉菜单示例代码,供大家参考,具体内容如下一.Flutter Drawer组件简介1.源码查
- 本文实例讲述了JAVA获取任意http网页源代码。分享给大家供大家参考,具体如下:JAVA获取任意http网页源代码可实现如下功能:1. 获
- 本文实例讲述了spring AOP的After增强实现方法。分享给大家供大家参考,具体如下:一 配置<?xml version=&qu
- 在日常开发中我们经常会使用到行情数据,很多的时候我们根据一个基准数据区构造行情,但是随着时间的推移然来构造的数据与真实行情数据之间的差距越来
- 下截JNative组件jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2解压JNati
- 在开发过程中,我们可能会经常遇到这样的需求样式:这张图是截取京东消息通知的弹出框,我们可以看到右上方有个三角形的气泡效果,这只是其中一种,三
- 在前端中我们知道用javascript就可以可以很容易实现,那么在Android中怎么实现这个功能呢?Java代码package com.e
- 发现问题肯定有人发现连接mysql失败,然后又找不到问题所在,又出现一大最报错,如下图。解决过程 1.先查询自己的java版本,在
- 摘要:Java8通过Function获取字段名,解决硬编码,效果类似于mybatis-plus的LambdaQueryWrapper。本文总
- 项目要用到Webview和js交互,查了查以前的项目感觉还是有必要整理下的。 简单描述下项目中用到的地方,比如说在web页需要用到登录的地方
- 本文实例讲述了C#泛型委托的用法。分享给大家供大家参考。具体分析如下:冒泡排序大家都知道,例如一个整形数组,可以用冒泡排序来使它按从小到大的
- 今天把Android Studio 2.3 更新为了3.0 遇到一个蛋疼的问题如图:格式化完代码后发现不会自动换行了,看着真心不爽。后来发现
- 前言最近在改进项目的并发功能,但开发起来磕磕碰碰的。看了好多资料,总算加深了认识。于是打算配合查看源代码,总结并发编程的原理。准备从用得最多
- 本文实例讲述了C#实现读取DataSet数据并显示在ListView控件中的方法。分享给大家供大家参考。具体如下:/*lvStudentLi
- 首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不怕了。既然说到了原理,我们还是