SpringCloud之Zuul 自定义filter
实现过滤器很简单,只需要继承ZuulFilter,并实现ZuulFilter中的抽象方法。
filterType():定义过滤器的类型,它有4种类型,分别是pre、post、routing和error
filterOrder():过滤顺序,它是一个Int类型的值,值越小,越早执行该过滤器
shouldFilter():表示该过滤器是否过滤逻辑,如果为true,则执行run方法,如果为false,则不执行run方法
Object run():写具体的过滤逻辑
注意重要说明,有些版本在转发post时,文件上传无法转法。只要升级下版本就可以了。
本示中使用的是 springcloud Edgware.RELEASE 对应springboot1.5.9
Spring Boot | Spring Cloud |
1.2.x | Angel版本 |
1.3.x | Brixton版本 |
1.4.xstripes | Camden版本 |
1.5.x | Dalston版本、Edgware版本 |
2.0.x | Finchley版本 |
2.1.x | Greenwich.SR2 |
示例
1.pom中引用
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.company</groupId>
<artifactId>zuuldemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>zuuldemo</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Edgware.RELEASE</version>
<relativePath></relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
</dependencies>
</project>
2.springcloud项目
2.1 src/main/resources/application.yml
server:
port: 80
spring:
application:
name: api-geteway
http:
multipart:
enabled: true # 使用http multipart上传处理
file-size-threshold: 1MB # 当上传文件达到1MB的时候进行磁盘写入
max-request-size: 10MB # 设置最大的请求文件的大小
max-file-size: 10MB # 设置单个文件的最大长度
zuul:
routes:
weixin:
path: /mypath/**
url: https://www.baidu.com
2.2 App.java
package com.company.zuuldemo; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean; import com.company.zuuldemo.filter.MyFilter; /**
* Hello world!
*
*/
@EnableZuulProxy
@SpringBootApplication
public class ZuulApp { //使用filter
@Bean
public MyFilter myFilter() {
return new MyFilter();
} // @Bean
// public FirstFilter firstFilter() {
// return new FirstFilter();
// }
//
// @Bean
// public SecondFilter secondFilter() {
// return new SecondFilter();
// } public static void main(String[] args) {
// System.out.println( "Hello World!" );
SpringApplication.run(ZuulApp.class);
}
}
2.3 MyFilter.java
package com.company.zuuldemo.filter; import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext; public class MyFilter extends ZuulFilter { final static Logger logger = LoggerFactory.getLogger(FirstFilter.class); // 这里可以依据url规则判断是否需要进行过滤 true需要过滤进入run方法 ,false直接忽略
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
logger.info(ctx.getRequest().getRequestURI() + " get request path info");
String url = ctx.getRequest().getRequestURI().toLowerCase(); // 这里判断url逻辑
if (url.startsWith("/login")) {
return false;
} return true;
} public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); // 通过其它业务生成token
String access_token = "user_name_token"; // 使用1 :向request的header中增加参数access_token
ctx.addZuulRequestHeader("access_token", access_token); // 使用2:向request的url里增加参数,示例增加 access_token
Map<String, List<String>> requestQueryParams = ctx.getRequestQueryParams();
if (requestQueryParams == null) {
requestQueryParams = new HashMap<>();
} requestQueryParams.put("access_token", Arrays.asList(access_token)); ctx.setRequestQueryParams(requestQueryParams); //使用3 ::判断是否登录,如果未登录直接返回404
if (access_token == null || access_token.trim().length() == 0) {
//过滤该请求,不对其进行路由(直接输入返回)
ctx.setSendZuulResponse(false);
//返回错误码
ctx.setResponseStatusCode(401);
// 返回错误内容
ctx.setResponseBody("{\"result\":\"access_token is not correct!\"}"); //让下一个Filter看到上一个Filter的状态用于过滤器间的协调
ctx.set("my_filter_is_success", false);
return null;
} // 对该请求进行路由(默认就是true)
//ctx.setSendZuulResponse(true);
//ctx.setResponseStatusCode(200);
//让下一个Filter看到上一个Filter的状态用于过滤器间的协调
ctx.set("my_filter_is_success", false); return null; //直接返回null即可
} @Override
public String filterType() {
// 前置过滤器
//pre:可以在请求被路由之前调用
//route:在路由请求时候被调用
//post:在route和error过滤器之后被调用
//error:处理请求时发生错误时被调用
return "pre";
} @Override
public int filterOrder() {
//优先级为0,数字越大,优先级越低
return 0;
}
}
SpringCloud之Zuul 自定义filter的更多相关文章
- Zuul【自定义Filter】
实际业务中,如果要自定义filter过滤器,只需集成ZuulFIlter类即可,该类是个抽象类,它实现了IZuulFIlter接口,我们需要实现几个方法,如下示例: import static org ...
- Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
- Spring-Cloud之Zuul路由网关-6
一.为什么需要Zuul? Zuul 作为微服务系统的网关组件,用于构建边界服务( Edge Service ),致力于动态路由.过滤.监控.弹性伸缩和安全.Zuul 作为路由网关组件,在微服务架构中有 ...
- Spring Cloud(十一):Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式
上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制,但其实Zuul还有更多的应用场景,比如:鉴权.流量转发.请求统计等等,这些功能都可以使用Zuul来实现. Zuul的核心 Filter是Zuu ...
- spring cloud深入学习(十二)-----Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式
Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ...
- Asp.net mvc自定义Filter简单使用
自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti ...
- Jinja2模版语言自定义filter的使用
Jinja2模版语言,自带有一些filter,能够在前端的模版中控制数据按照相应的方式显示.比如以下两种filter,分别能在前端控制数字的近似精度显示和根据字符串长度补齐: round(value, ...
- HBase笔记--自定义filter
自定义filter需要继承的类:FilterBase 类里面的方法调用顺序 方法名 作用 1 boolean filterRowKey(Cell cell) 根据row key过滤row.如果需要 ...
- Spring MVC 项目搭建 -6- spring security 使用自定义Filter实现验证扩展资源验证,使用数据库进行配置
Spring MVC 项目搭建 -6- spring security使用自定义Filter实现验证扩展url验证,使用数据库进行配置 实现的主要流程 1.创建一个Filter 继承 Abstract ...
随机推荐
- CentOS 7下安装IDL 8.2
材料准备: CentOS 7 x86_64 IDL 8.2,下载自 ftp://ftp.lowell.edu/incoming/temp/old/IDL_Clients/v8.2/idl82sp2li ...
- Maven - Maven Project与Maven Module区别和联系
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/J080624/article/detai ...
- 【Java Web】简易商品信息管理系统——首个Web项目
正文之前 在学习了一段时间的Java Web的内容之后,当然需要有个项目来练练手,我相信大多数人的首选项目都是信息管理系统吧,所以我选择了商品信息管理系统 目前项目源码已全部上传至GitHub,欢迎大 ...
- 2018 焦作网络赛 G Give Candies ( 欧拉降幂 )
题目链接 题意 : 给出 N 个糖果.老师按顺序给 1~N 编号的学生分配糖果.每个学生要么不分.要么最少分一个.且由于是按顺序发放.那么对于某个有分到糖果的编号为 i 的学生.则 1~(i-1) 这 ...
- P1914 小书童——密码
输入格式: 第一行:n.第二行:未移动前的一串字母 输出格式: 一行,是此蒟蒻的密码 直接上代码: #include<iostream> using namespace std; int ...
- C++入门经典-例7.1-对象之访问类成员
1:建立一个类CPerson. (1)在person.h文件中代码: class CPerson { public: //数据成员 int m_iIndex; ]; short m_shAge; do ...
- 黑马lavarel教程---13、分页
黑马lavarel教程---13.分页 一.总结 一句话总结: - lavarel里面的分页操作和tp里面的分页操作几乎是一模一样的 - 控制器:$data=Lesson::paginate(2); ...
- php laravel左连接leftJoin多条where语句
通常情况下我们在做leftjoin连接时需要对不止一个条件进行进行匹配,这时候就需要使用闭包方式,如下: leftjoin('db', function ($join) {···}); leftjoi ...
- linux 禁ping
今天用nmap扫描了局域网的主机,发现几个主机开着好多危险端口,做linux的,对这些安全知识有一点了解.遂用nmap扫描了自己的主机是否存在可利用端口.发现每次nmap都能成功的检测我的主机是ali ...
- LC 846. Hand of Straights
Alice has a hand of cards, given as an array of integers. Now she wants to rearrange the cards into ...