Spring-Cloud Zuul在转发的多部分请求文件名中打破UTF-8符号

时间:2017-01-26 19:40:58

标签: spring-boot utf-8 microservices netflix-zuul netflix-eureka

这是我第一次参加,所以请耐心等待我的第一个问题。

我认为我有某种配置问题,但经过一天的实验后我才陷入困境。我们的应用程序基于Spring-Cloud [Brixton发布]。我们有这样的配置:Portal(Web应用程序提供基于角度的web-ui),它具有配置到我们的网关服务的单路由的zuul代理,如下所示:

zuul:
   ignoredServices: '*'
   prefix: /api
   routes:
       api-proxy:
          path: /**
          serviceId: api-gateway

配置了另一个Zuul并将请求转发给内部业务逻辑服务:

zuul:
  ignoredServices: '*'
  routes:
     service1:
       path: /service1/**
       serviceId: service1
     service2:
       path: /service2/**
       serviceId: service2

所有这些配置都没有问题。 我现在面临的问题是文件上传多部分请求。更准确地说 - 那些多部分请求,当要上传的文件具有来自UTF-8的非拉丁符号(例如,ñčęėįš)时。当请求到达必须处理@RequestPart MultipartFile file的服务时,file.getOriginalFilename()会在上述符号的位置返回问号。现在,我已经尝试将这样的文件直接上传到这样的控制器,并且文件名没有问号,也就是说,没有破坏,这表明,当代理中继接收请求时,在Zuul过滤器中的某处发生了对多部分请求的一些错误解释/解析。

也许有人和Zuul有过类似的经历,可以指导我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

我自己也遇到了同样的问题,并创建了以下问题:

https://jira.spring.io/browse/SPR-15396

希望这可以在Spring 4.3.8中进行配置。

与此同时,您必须创建一个#define N 3.0 // number of columns #define M 3. // number of rows #import "GPUImageWarholFilter.h" NSString *const kGPUImageWarholFragmentShaderString = SHADER_STRING ( precision highp float; varying highp vec2 textureCoordinate; uniform sampler2D inputImageTexture; void main() { vec4 color = texture2D(inputImageTexture, vec2(fract(textureCoordinate.x * N)/(M/ N), fract(textureCoordinate.y * M) / (M/N))); gl_FragColor = color; } ); 类型的bean(它会覆盖FormBodyWrapperFilter中的那个)。在构造函数中,您传递ZuulConfiguration的副本,该副本从FormHttpMessageConverter扩展,并将FormHttpMessageConverter中使用的编码更改为UTF-8(您可能还希望删除对{1}}的任何引用javax-mail,除非你在classpath上有这个)。您需要最新版本的Spring Cloud Netflix才能执行此操作。

示例:

FormHttpMessageConverter.MultipartHttpOutputMessage#getAsciiBytes(String)

然后创建@Bean FormBodyWrapperFilter formBodyWrapperFilter() { return new FormBodyWrapperFilter(new MyFormHttpMessageConverter()); } 的副本,并更改​​以下方法:

FormHttpMessageConverter

答案 1 :(得分:2)

即使使用较新版本,修改响应后仍有问题
使用 spring boot 2.3.8.RELEASE
通过强制以下弹簧属性设法修复它

server.servlet.encoding.force= true  
server.servlet.encoding.charset= UTF-8