2024 год, а с кодировкой UTF-8 все еще проблемы. Вот моя проблема свелась к очень простому проекту с тестами (всего два важных класса, остальное — шаблон, созданный с помощью Spring Initalizr):
https://github.com/kicktipp/springumlaut
У меня есть перенаправление в приложении SpringBoot, которое содержит немецкий умлаут, например «ö».
@GetMapping("/hallo")
public String hallo() {
return "redirect:/hallöchen";
}
@ResponseBody
@GetMapping("/hallöchen")
public String helloWithUmlaut() {
return "Hallöchen";
}
При работе с движком Tomcat по умолчанию я получаю код состояния 400 с сообщением
java.lang.IllegalArgumentException: в цель запроса [/hall0xc30xb6chen]. Допустимые символы определены в RFC 7230 и RFC 3986
Ошибка выдается CoyoteAdapter в строке 1068 метода ConvertURI, а в комментарии говорится, что этого никогда не должно происходить:
// Should never happen as B2CConverter should replace
// problematic characters
request.getResponse().sendError(HttpServletResponse.SC_BAD_REQUEST);
В моем тесте, когда я напрямую вызываю URL-адрес с помощью умлаута, все работает нормально.
Почему Spring Boot не кодирует этот URL должным образом, чтобы все работало «из коробки», и как это исправить самым простым и стандартным способом?




Как описано в комментарии, буквальные части URL-адреса перенаправления не кодируются автоматически.
Например, вы можете использовать RedirectAttributes для встраивания переменных URI:
@GetMapping("/hallo")
public String hallo(RedirectAttributes attributes) {
attributes.addAttribute("var", "hallöchen");
return "redirect:/{var}";
}
или закодируйте его самостоятельно:
@GetMapping("/hallo")
public String hallo() throws UnsupportedEncodingException {
return "redirect:/" + URLEncoder.encode("hallöchen", "UTF-8");
}
Я добавил ваше решение в проект на github для дальнейшего использования github.com/kicktipp/springumlaut
Спасибо, кажется, теперь я это понял. Было бы здорово, если бы все было автоматически в формате utf-8. так сложно решить, где и когда кодировать/декодировать