18

How can I set relaxedQueryChars for Spring Boot embedded Tomcat?

The connector attribute described here, but Spring Boot documentation has no such parameter listed.

How to set Tomcat's Connector attributes in general?

Alex Karasev
  • 1,108
  • 2
  • 13
  • 24

4 Answers4

17

I am not sure if you can do this with properties file. I believe this should work

@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");
            }
        });
    }
}
pvpkiran
  • 25,582
  • 8
  • 87
  • 134
  • 2
    Correct, but might be simplified with lambda `factory.addConnectorCustomizers(connector -> connector.setAttribute("relaxedQueryChars", "yourvaluehere"))` – Alex Karasev Aug 06 '18 at 09:04
  • may worth mentioning that connector.setAttribute was deprecated in 8, 9 and completely removed in 10 https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/connector/Connector.html https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/connector/Connector.html https://tomcat.apache.org/tomcat-10.0-doc/api/org/apache/catalina/connector/Connector.html – HoaPhan Apr 22 '23 at 13:55
9

If you are using Spring Boot 2.x then you need to use WebSeerverFactoryCustomizer as given below.

@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", "<>[\\]^`{|}");
        });
    }
}
Sunil Chauraha
  • 525
  • 1
  • 7
  • 21
  • Don't forget to include @Configuration annotation for the class that contains this. – Asu Oct 07 '21 at 00:29
7

The simplest method is to configure the server (add a line to application.properties). You can add something like this:

server.tomcat.relaxed-path-chars=<,>,etc
  • Spring Documentation Comma-separated list of additional unencoded characters that should be allowed in URI paths. Only "< > [ \ ] ^ ` { | }" are allowed.*
5

I did this as a working solution for me:

@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", "<>[\\]^`{|}");
        });
    }

}
matzeihnsein
  • 678
  • 7
  • 16