Symbole inne niż ASCII w zmiennej ścieżki aplikacji Spring MVC na wbudowanym serwerze Tomcat za pomocą Spring Boot
Buduję usługę przy użyciu Spring MVC skonfigurowanego za pomocą Spring Boot, gdzie chcę mieć dowolne znaki Unicode w adresach URL.
Rozglądając się po sieci, kończę na
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Main {
public static void main(String... args) throws Exception {
SpringApplication.run(Main.class, args);
}
@Bean
public Filter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
}
}
i
@Controller
public class WordController {
@RequestMapping(value="/word/{word}", method=RequestMethod.GET)
public String greeting(Model model, @PathVariable("word") String word) {
System.out.println(word);
model.addAttribute("word", word);
return "word";
}
}
gdzie szablon „słowo” po prostu wypisuje słowo z modelu.
Kiedy uruchomię serwer i wejdęhttp://localhost:8080/word/æøå
w Chrome tekst wydrukowany na stronie odpowiedzi (iw terminalu) jest
æøå
co uważam za interpretację duńskich liter ISO-8859-1æøå
kiedy są faktycznie zakodowane w UTF-8.
Patrząc w inspektora sieci Chrome, widzę, że faktycznie pytahttp://localhost:8080/word/%C3%A6%C3%B8%C3%A52
co wydaje się być kodowaniem URL łańcucha w UTF-8.
Czy ktoś może wyjaśnić, dlaczego Spring nie analizuje zmiennej ścieżki jako UTF-8 pomimo tej konfiguracji i jak to zrobić?
Wydaje się, że mieszane opinie na temat tego, czyCharacterEncodingFilter
faktycznie rozwiązuje ten problem. Przynajmniej w innym (innym niż Boot) projekcie Spring, którego używamweb.xml
zarejestrowaćCharacterEncodingFilter
. Tutaj jest z powodzeniem używany do sprawiania, że ciała POST są analizowane jako UTF-8, ale ja też nie mogę sprawić, by działał dla zmiennych ścieżki.
Ta odpowiedź sugeruje skonfigurowanie go w ustawieniach Tomcat. Jeśli tak, jak to zrobić na wbudowanym serwerze?