2

我正在使用使用 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的设置中进行配置。如果是这样,如何在嵌入式服务器上完成?

4

1 回答 1

2

在脑电波事件之后,添加 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 正文。

于 2014-01-04T21:08:00.793 回答