diff --git a/spring-boot-docs/src/main/asciidoc/howto.adoc b/spring-boot-docs/src/main/asciidoc/howto.adoc index 8e4f603c658..4308b3491e3 100644 --- a/spring-boot-docs/src/main/asciidoc/howto.adoc +++ b/spring-boot-docs/src/main/asciidoc/howto.adoc @@ -785,22 +785,13 @@ format out of the box, and you may see the following error: If at all possible, you should consider updating your code to only store values compliant with later Cookie specifications. If, however, you're unable to change the way that cookies are written, you can instead configure Tomcat to use a -`LegacyCookieProcessor`. To switch to the `LegacyCookieProcessor` use a -`TomcatContextCustomizer` bean: +`LegacyCookieProcessor`. To switch to the `LegacyCookieProcessor` use an +`EmbeddedServletContainerCustomizer` bean that adds a `TomcatContextCustomizer`: -[source,java,indent=0,subs="verbatim,quotes,attributes"] +[source,java,indent=0] +---- +include::{code-examples}/context/embedded/TomcatLegacyCookieProcessorExample.java[tag=customizer] ---- - @Bean - public TomcatContextCustomizer customizer() { - return new TomcatContextCustomizer() { - - void customize(Context context) { - context.setCookieProcessor(new LegacyCookieProcessor()); - } - - }; - } -} diff --git a/spring-boot-docs/src/main/java/org/springframework/boot/context/embedded/TomcatLegacyCookieProcessorExample.java b/spring-boot-docs/src/main/java/org/springframework/boot/context/embedded/TomcatLegacyCookieProcessorExample.java new file mode 100644 index 00000000000..150f356f3e6 --- /dev/null +++ b/spring-boot-docs/src/main/java/org/springframework/boot/context/embedded/TomcatLegacyCookieProcessorExample.java @@ -0,0 +1,67 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.context.embedded; + +import org.apache.catalina.Context; +import org.apache.tomcat.util.http.LegacyCookieProcessor; + +import org.springframework.boot.context.embedded.tomcat.TomcatContextCustomizer; +import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Example configuration for configuring Tomcat with to use {@link LegacyCookieProcessor}. + * + * @author Andy Wilkinson + */ +public class TomcatLegacyCookieProcessorExample { + + /** + * Configuration class that declares the required + * {@link EmbeddedServletContainerCustomizer}. + */ + @Configuration + static class LegacyCookieProcessorConfiguration { + + // tag::customizer[] + @Bean + public EmbeddedServletContainerCustomizer cookieProcessorCustomizer() { + return new EmbeddedServletContainerCustomizer() { + + @Override + public void customize(ConfigurableEmbeddedServletContainer container) { + if (container instanceof TomcatEmbeddedServletContainerFactory) { + ((TomcatEmbeddedServletContainerFactory) container) + .addContextCustomizers(new TomcatContextCustomizer() { + + @Override + public void customize(Context context) { + context.setCookieProcessor(new LegacyCookieProcessor()); + } + + }); + } + } + + }; + } + // end::customizer[] + + } + +} diff --git a/spring-boot-docs/src/test/java/org/springframework/boot/context/embedded/TomcatLegacyCookieProcessorExampleTests.java b/spring-boot-docs/src/test/java/org/springframework/boot/context/embedded/TomcatLegacyCookieProcessorExampleTests.java new file mode 100644 index 00000000000..3fcad5eb37b --- /dev/null +++ b/spring-boot-docs/src/test/java/org/springframework/boot/context/embedded/TomcatLegacyCookieProcessorExampleTests.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.context.embedded; + +import org.apache.catalina.Context; +import org.apache.tomcat.util.http.LegacyCookieProcessor; +import org.junit.Test; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.embedded.TomcatLegacyCookieProcessorExample.LegacyCookieProcessorConfiguration; +import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer; +import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link TomcatLegacyCookieProcessorExample}. + * + * @author Andy Wilkinson + */ +public class TomcatLegacyCookieProcessorExampleTests { + + @Test + public void cookieProcessorIsCustomized() { + EmbeddedWebApplicationContext applicationContext = (EmbeddedWebApplicationContext) new SpringApplication( + TestConfiguration.class, LegacyCookieProcessorConfiguration.class).run(); + Context context = (Context) ((TomcatEmbeddedServletContainer) applicationContext + .getEmbeddedServletContainer()).getTomcat().getHost().findChildren()[0]; + assertThat(context.getCookieProcessor()) + .isInstanceOf(LegacyCookieProcessor.class); + } + + @Configuration + static class TestConfiguration { + + @Bean + public TomcatEmbeddedServletContainerFactory tomcatFactory() { + return new TomcatEmbeddedServletContainerFactory(0); + } + + @Bean + public EmbeddedServletContainerCustomizerBeanPostProcessor postProcessor() { + return new EmbeddedServletContainerCustomizerBeanPostProcessor(); + } + + } + +}