基于ZUUL过滤对请求中文件参数进行编解码/加解密/替换

本文介绍了如何利用ZUUL过滤器处理文件上传和下载请求中的文件参数,通过Base64编码和解码,以适应特定中台系统的要求。在项目部署结构中,ZUUL网关分别在外和内部实现不同功能,如编码、解码、安全管理、限流等。详细阐述了文件上传和下载的过滤器实现逻辑,以及相关的编码工具类。
摘要由CSDN通过智能技术生成

目录

前言

思路流程

代码

相关pom jar

文件上传过滤器

文件下载过滤器 

Bse64编码工具类

前言

在项目中遇到需要将前台涉及文件上传或下载的请求中的文件参数进行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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Cloud ,可以使用 Zuul 作为 API 网关,通过 Zuul 进行请求转发和路由。而 Zuul 还提供了过滤器(Filter)机制,可以在请求被路由到目标服务前、后进行一些预处理或后处理。 在 Zuul 过滤器分为四种类型: 1. Pre:在请求被路由到目标服务前执行; 2. Post:在请求被路由到目标服务后执行; 3. Route:用于将请求路由到目标服务的过程执行; 4. Error:在请求发生错误时执行。 通过实现 Zuul过滤器接口,可以自定义过滤器,并指定过滤器的类型和执行顺序。在过滤器,可以对请求或响应进行修改或者拦截。 对于过滤器的返回值拦截,可以在 Pre 和 Error 类型的过滤器进行。在 Pre 类型的过滤器,可以通过抛出异常的方式终止请求,并将异常信息返回给客户端。在 Error 类型的过滤器,可以通过设置响应状态码、响应头信息等方式,修改响应内容。 例如,在 Pre 类型的过滤器,可以通过以下代码实现返回拦截: ```java public class AuthFilter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String authToken = request.getHeader("Authorization"); if (StringUtils.isBlank(authToken)) { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); ctx.setResponseBody("Unauthorized"); return null; } return null; } } ``` 在该过滤器,如果请求不存在 Authorization 字段,则设置返回状态码为 401,并设置响应内容为 "Unauthorized",从而实现了返回值拦截。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值