Java 设置';relaxedQueryChars&x27;对于嵌入式Tomcat

Java 设置';relaxedQueryChars&x27;对于嵌入式Tomcat,java,spring-boot,tomcat,Java,Spring Boot,Tomcat,如何为Spring Boot嵌入式Tomcat设置relaxedQueryChars 描述了连接器属性,但Spring Boot没有列出此类参数 一般来说,如何设置Tomcat的连接器属性?我不确定是否可以使用属性文件进行设置。我相信这应该行得通 @Component public class MyTomcatWebServerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFac

如何为Spring Boot嵌入式Tomcat设置
relaxedQueryChars

描述了连接器属性,但Spring Boot没有列出此类参数


一般来说,如何设置Tomcat的连接器属性?

我不确定是否可以使用属性文件进行设置。我相信这应该行得通

@Component
public class MyTomcatWebServerCustomizer
        implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                connector.setAttribute("relaxedQueryChars", "yourvaluehere");
            }
        });
    }
}
@组件
公共类MyTomcatWebServerCustomizer
实现WebServerFactoryCustomizer{
@凌驾
公共void自定义(TomcatServletWebServerFactory){
addConnectorCustomizer(新的TomcatConnectorCustomizer(){
@凌驾
公共void自定义(连接器){
setAttribute(“relaxedQueryChars”、“yourvaluehere”);
}
});
}
}

我这样做是为了解决我的问题:

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer(){
    return new MyCustomizer();
}

private static class MyCustomizer implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer factory) {
        if(factory instanceof TomcatEmbeddedServletContainerFactory) {
            customizeTomcat((TomcatEmbeddedServletContainerFactory) factory);
        }
    }

    void customizeTomcat(TomcatEmbeddedServletContainerFactory factory) {
        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
            connector.setAttribute("relaxedPathChars", "<>[\\]^`{|}");
            connector.setAttribute("relaxedQueryChars", "<>[\\]^`{|}");
        });
    }

}
@Bean
公共嵌入式ServletContainerCustomizer containerCustomizer(){
返回新的MyCustomizer();
}
私有静态类MyCustomizer实现EmbeddedServletContainerCustomizer{
@凌驾
public void自定义(ConfigurableMbeddedServletContainer工厂){
if(TomcatEmbeddedServletContainerFactory的工厂实例){
定制MCAT((TomcatEmbeddedServletContainerFactory)工厂);
}
}
void customizeTomcat(TomcatEmbeddedServletContainerFactory工厂){
factory.AddConnectorCustomizer((TomcatConnectorCustomizer)连接器->{
setAttribute(“relaxedPathChars”,“[\\]^`{124;}”);
setAttribute(“relaxedQueryChars”,“[\\]^`{124;}”);
});
}
}

如果您使用的是Spring Boot 2.x,则需要使用WebSeerverFactoryCustomizer,如下所示

@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> 
    containerCustomizer(){
    return new EmbeddedTomcatCustomizer();
}

private static class EmbeddedTomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
            connector.setAttribute("relaxedPathChars", "<>[\\]^`{|}");
            connector.setAttribute("relaxedQueryChars", "<>[\\]^`{|}");
        });
    }
}
@Bean
公共WebServerFactoryCustomizer
containerCustomizer(){
返回新的EmbeddedTomcatCustomizer();
}
私有静态类EmbeddedTomcatCustomizer实现WebServerFactoryCustomizer{
@凌驾
公共void自定义(TomcatServletWebServerFactory){
factory.AddConnectorCustomizer((TomcatConnectorCustomizer)连接器->{
setAttribute(“relaxedPathChars”,“[\\]^`{124;}”);
setAttribute(“relaxedQueryChars”,“[\\]^`{124;}”);
});
}
}

最简单的方法是配置服务器(在application.properties中添加一行)。 您可以添加如下内容:

server.tomcat.relaxed-path-chars=<,>,etc
server.tomcat.relaxed path chars=,等等
  • URI路径中应允许的其他未编码字符的逗号分隔列表。只允许使用“<>[\]^`{124;}”*

正确,但可以使用lambda
factory.addConnectorCustomizers(连接器->连接器.setAttribute(“relaxedQueryChars”,“yourvaluehere”))进行简化。