小编典典

使用Spring Boot在嵌入式Tomcat服务器设置上的Spring MVC应用程序的路径变量中的非ASCII符号

spring-boot

我正在使用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时,在响应页面(和终端)中打印的文本是

æøå

我认为æøå当丹麦字母实际上以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的设置中对其进行配置。如果是这样,如何在嵌入式服务器上完成?


阅读 363

收藏
2020-05-30

共1个答案

小编典典

在发生脑波事件之后,添加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机构仍然是必要的。

2020-05-30