目录
前言
在项目中遇到需要将前台涉及文件上传或下载的请求中的文件参数进行Base64编码,以便于适应他们本地的中台系统。调用流程为 前台Nginx服务器----->中台服务----->后台Service服务,其中他们的中台服务硬性要求了这种功能。
乍一听感觉好奇怪的需求,但是毕竟甲方爸爸这么要求了,咱也没办法,撸袖子干吧。
为了减少对原后台服务的修改,且减少代码暴露,我想到了利用网关技术,在中台系统两端添加网关,对请求进行过滤包装来实现功能的解耦,且可定义修改,刚开始采用了cloud gateway技术,但是在实际编程中发现gateway 内嵌的是基于webflux技术替代了我们传统的mvc,因此在编写过滤器对请求中的文件参数进行过滤时极其麻烦,最后不得已使用的zuul2来实现此功能。
部署结构为 Nginx服务器----->zuul网关服务(外)------>中台服务----->zuul网关服务(内)------->后台Service服务
其中zuul外服务主要用于过滤转发验证码请求,字典缓存请求、静态资源文件缓存请求,请求中文件参数请求编码、安全管理过滤、限流等。zuul内服务主要用户对请求中的文件参数进行解码。
思路流程
文件上传
1.使用zuul编写文件上传Pre过滤器,获取http请求中的Content-type属性,如果包含“multipart/form-data”关键字则证明此请求为文件上传。
2.解析http文件上传请求,根据配置判断此文件发生在zuul外服务还是内服务,如果是外服务则对请求中的文件进行编码,如果是内服务则对请求中的文件参数进行解码。
文件下载
1.如果是文件下载请求,则相比文件上传简单许多,编写zuul文件下载Post过滤器,获取请求中的content-type属性,如果包含相应的下载格式,(这里我们只涉及到了Excel的下载,故在下面的代码中我只判断了“application/msexcel”格式,如果包含其他的格式则可根据需要进行自定义添加。)则证明此请求为文件下载
2.获取响应流,根据配置判断此文件发生在zuul外服务还是内服务,如果是外服务则对响应流进行解码,如果是内服务则对响应流进行编码码。
代码
相关pom jar
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
文件上传过滤器
package com.zuul.filters;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.netflix.zuul.http.HttpServletRequestWrapper;
import com.netflix.zuul.http.ServletInputStreamWrapper;
import com.zuul.constants.CommonConstant;
import com.zuul.syslogs.ErrorLog;
import com.zuul.utiils.Base64EncodeDecodeUtil;
import org.apache.commons.lang3.StringUtils;
imp