我正在使用使用 Spring Boot 设置的 Spring MVC 构建服务,我希望能够在 URL 中包含任意 unicode 字符。
通过环顾网络,我最终得到
@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;
}
}
和
@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";
}
}
模板“单词”只是从模型中打印出单词。
当我启动服务器并进入http://localhost:8080/word/æøå
Chrome 时,响应页面(和终端)上打印的文本是
æøå
我认为当丹麦字母æøå
实际上以 UTF-8 编码时,我认为这是 ISO-8859-1 对丹麦字母的解释。
查看 Chrome 的网络检查器,我发现它实际上查询http://localhost:8080/word/%C3%A6%C3%B8%C3%A52
的确实似乎是 UTF-8 中字符串的 URL 编码。
谁能解释为什么尽管有这种配置,Spring 仍不将路径变量解析为 UTF-8,以及如何制作?
关于是否CharacterEncodingFilter
真正解决了这个问题似乎有不同的看法。至少,在我的另一个(非引导)Spring 项目中,我web.xml
用来注册CharacterEncodingFilter
. 在这里,它成功地用于使 POST 正文解析为 UTF-8,但我也无法让它适用于那里的路径变量。
这个答案表明它应该在Tomcat的设置中进行配置。如果是这样,如何在嵌入式服务器上完成?