我正在使用Spring MVC构建一个服务,该服务是通过Spring Boot设置的,我希望在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时,在响应页面(和终端)中打印的文本是
http://localhost:8080/word/æøå
æøå
我认为æøå当丹麦字母实际上以UTF-8编码时,我认为这是ISO-8859-1的解释。
æøå
查看Chrome的网络检查器后,我发现它实际上查询的http://localhost:8080/word/%C3%A6%C3%B8%C3%A52确实是UTF-8中字符串的URL编码。
http://localhost:8080/word/%C3%A6%C3%B8%C3%A52
任何人都可以解释为什么尽管进行了这种配置,Spring还是不会将路径变量解析为UTF-8,以及如何实现?
关于是否CharacterEncodingFilter真正解决这个问题,似乎有不同的意见。至少在我的另一个(非引导)Spring项目中,我web.xml用来注册CharacterEncodingFilter。在这里,它已成功地用于使POST正文解析为UTF-8,但我也不能使其用于路径变量。
CharacterEncodingFilter
web.xml
该答案建议应在Tomcat的设置中对其进行配置。如果是这样,如何在嵌入式服务器上完成?
在发生脑波事件之后,添加bean方法
@Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(8080); factory.addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { connector.setURIEncoding("UTF-8"); } }); return factory; }
似乎解决了问题。
编辑
该CharacterEncodingFilter转换POST机构仍然是必要的。