3

это первый раз для меня на SO, поэтому, пожалуйста, будьте терпеливы для моего первого вопроса.Spring-Cloud Zuul разрывает символы UTF-8 в перенаправленном имени файла с множественным запросом

Я думаю, что у меня какая-то проблема конфигурации, но после дня экспериментов я застрял. Наше приложение основано на Spring-Cloud [выпуск Brixton]. Мы имеем конфигурацию, как это: Portal (веб-приложение, служащее угловой на основе веб-интерфейс), который имеет Zu прокси с одного маршрутом сконфигурированного к нашему сервису шлюза, например, так:

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, когда прокси-ретранслятор запрашивает запрос.

Возможно, у кого-то был аналогичный опыт с Зуулом и он может направить меня каким-то образом, чтобы решить эту проблему?

+0

Один из самых странных ошибок, я когда-либо видел .. – nurgasemetey

ответ

2

Я просто побежал в тот же вопрос сам, и создал следующий вопрос:

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

Надеюсь, это становится конфигурируемый весной 4.3.8.

А пока вы должны создать бобов типа FormBodyWrapperFilter (что переопределяет значение в ZuulConfiguration). В конструкторе вы передаете копию FormHttpMessageConverter, которая простирается от FormHttpMessageConverter, и вы меняете кодировку, используемую в FormHttpMessageConverter.MultipartHttpOutputMessage#getAsciiBytes(String), на UTF-8 (вы также можете удалить любые ссылки на javax-mail, если у вас нет этого в classpath). Для этого вам понадобится довольно новая версия Spring Cloud Netflix.

Пример:

@Bean 
FormBodyWrapperFilter formBodyWrapperFilter() { 
    return new FormBodyWrapperFilter(new MyFormHttpMessageConverter()); 
} 

Затем вы создаете копию FormHttpMessageConverter и изменить следующий метод:

private byte[] getAsciiBytes(String name) { 
     try { 
      // THIS IS THE ONLY MODIFICATION: 
      return name.getBytes("UTF-8"); 
     } catch (UnsupportedEncodingException ex) { 
      // Should not happen - US-ASCII is always supported. 
      throw new IllegalStateException(ex); 
     } 
    } 
+0

Не могли бы вы опубликовать пример ? – nurgasemetey

+1

Пример, добавленный выше, –

+0

Очень благодарю вас! – nurgasemetey