Provide support for filter registrations
The AbstractDispatcherServletInitializer now provides support for the registration of filters to be mapped to the DispatcherServlet. It also sets the asyncSupported flag by default on the DispatcherServlet and all registered filters. Issue: SPR-9696
This commit is contained in:
@@ -16,26 +16,33 @@
|
||||
|
||||
package org.springframework.web.servlet.support;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.EnumSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.DispatcherType;
|
||||
import javax.servlet.Filter;
|
||||
import javax.servlet.FilterRegistration.Dynamic;
|
||||
import javax.servlet.Servlet;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRegistration;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.mock.web.MockServletContext;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
||||
import org.springframework.web.filter.HiddenHttpMethodFilter;
|
||||
import org.springframework.web.servlet.DispatcherServlet;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Test case for {@link AbstractAnnotationConfigDispatcherServletInitializer}.
|
||||
*
|
||||
@@ -45,6 +52,8 @@ public class AnnotationConfigDispatcherServletInitializerTests {
|
||||
|
||||
private static final String SERVLET_NAME = "myservlet";
|
||||
|
||||
private static final String FILTER_NAME = "hiddenHttpMethodFilter";
|
||||
|
||||
private static final String ROLE_NAME = "role";
|
||||
|
||||
private static final String SERVLET_MAPPING = "/myservlet";
|
||||
@@ -55,14 +64,21 @@ public class AnnotationConfigDispatcherServletInitializerTests {
|
||||
|
||||
private Map<String, Servlet> servlets;
|
||||
|
||||
private Map<String, MockDynamic> registrations;
|
||||
private Map<String, MockServletRegistration> servletRegistrations;
|
||||
|
||||
private Map<String, Filter> filters;
|
||||
|
||||
private Map<String, MockFilterRegistration> filterRegistrations;
|
||||
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
servletContext = new MyMockServletContext();
|
||||
initializer = new MyAnnotationConfigDispatcherServletInitializer();
|
||||
servlets = new LinkedHashMap<String, Servlet>(2);
|
||||
registrations = new LinkedHashMap<String, MockDynamic>(2);
|
||||
servlets = new LinkedHashMap<String, Servlet>(1);
|
||||
servletRegistrations = new LinkedHashMap<String, MockServletRegistration>(1);
|
||||
filters = new LinkedHashMap<String, Filter>(1);
|
||||
filterRegistrations = new LinkedHashMap<String, MockFilterRegistration>();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -73,29 +89,82 @@ public class AnnotationConfigDispatcherServletInitializerTests {
|
||||
assertNotNull(servlets.get(SERVLET_NAME));
|
||||
|
||||
DispatcherServlet servlet = (DispatcherServlet) servlets.get(SERVLET_NAME);
|
||||
WebApplicationContext servletContext = servlet.getWebApplicationContext();
|
||||
((AnnotationConfigWebApplicationContext) servletContext).refresh();
|
||||
WebApplicationContext dispatcherServletContext = servlet.getWebApplicationContext();
|
||||
((AnnotationConfigWebApplicationContext) dispatcherServletContext).refresh();
|
||||
|
||||
assertTrue(servletContext.containsBean("bean"));
|
||||
assertTrue(servletContext.getBean("bean") instanceof MyBean);
|
||||
assertTrue(dispatcherServletContext.containsBean("bean"));
|
||||
assertTrue(dispatcherServletContext.getBean("bean") instanceof MyBean);
|
||||
|
||||
assertEquals(1, registrations.size());
|
||||
assertNotNull(registrations.get(SERVLET_NAME));
|
||||
assertEquals(1, servletRegistrations.size());
|
||||
assertNotNull(servletRegistrations.get(SERVLET_NAME));
|
||||
|
||||
MockDynamic registration = registrations.get(SERVLET_NAME);
|
||||
assertEquals(Collections.singleton(SERVLET_MAPPING), registration.getMappings());
|
||||
assertEquals(1, registration.getLoadOnStartup());
|
||||
assertEquals(ROLE_NAME, registration.getRunAsRole());
|
||||
MockServletRegistration servletRegistration = servletRegistrations.get(SERVLET_NAME);
|
||||
|
||||
assertEquals(Collections.singleton(SERVLET_MAPPING), servletRegistration.getMappings());
|
||||
assertEquals(1, servletRegistration.getLoadOnStartup());
|
||||
assertEquals(ROLE_NAME, servletRegistration.getRunAsRole());
|
||||
assertTrue(servletRegistration.isAsyncSupported());
|
||||
|
||||
assertEquals(1, filterRegistrations.size());
|
||||
assertNotNull(filterRegistrations.get(FILTER_NAME));
|
||||
|
||||
MockFilterRegistration filterRegistration = filterRegistrations.get(FILTER_NAME);
|
||||
|
||||
assertTrue(filterRegistration.isAsyncSupported());
|
||||
assertEquals(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.ASYNC),
|
||||
filterRegistration.getMappings().get(SERVLET_NAME));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void asyncSupportedFalse() throws ServletException {
|
||||
initializer = new MyAnnotationConfigDispatcherServletInitializer() {
|
||||
@Override
|
||||
protected boolean isAsyncSupported() {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
initializer.onStartup(servletContext);
|
||||
|
||||
MockServletRegistration servletRegistration = servletRegistrations.get(SERVLET_NAME);
|
||||
assertFalse(servletRegistration.isAsyncSupported());
|
||||
|
||||
MockFilterRegistration filterRegistration = filterRegistrations.get(FILTER_NAME);
|
||||
assertFalse(filterRegistration.isAsyncSupported());
|
||||
assertEquals(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE),
|
||||
filterRegistration.getMappings().get(SERVLET_NAME));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noFilters() throws ServletException {
|
||||
initializer = new MyAnnotationConfigDispatcherServletInitializer() {
|
||||
@Override
|
||||
protected Filter[] getServletFilters() {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
initializer.onStartup(servletContext);
|
||||
|
||||
assertEquals(0, filterRegistrations.size());
|
||||
}
|
||||
|
||||
|
||||
private class MyMockServletContext extends MockServletContext {
|
||||
|
||||
@Override
|
||||
public ServletRegistration.Dynamic addServlet(String servletName,
|
||||
Servlet servlet) {
|
||||
public ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet) {
|
||||
servlets.put(servletName, servlet);
|
||||
MockDynamic registration = new MockDynamic();
|
||||
registrations.put(servletName, registration);
|
||||
MockServletRegistration registration = new MockServletRegistration();
|
||||
servletRegistrations.put(servletName, registration);
|
||||
return registration;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dynamic addFilter(String filterName, Filter filter) {
|
||||
filters.put(filterName, filter);
|
||||
MockFilterRegistration registration = new MockFilterRegistration();
|
||||
filterRegistrations.put(filterName, registration);
|
||||
return registration;
|
||||
}
|
||||
}
|
||||
@@ -118,6 +187,11 @@ public class AnnotationConfigDispatcherServletInitializerTests {
|
||||
return new String[]{"/myservlet"};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter[] getServletFilters() {
|
||||
return new Filter[] { new HiddenHttpMethodFilter() };
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
|
||||
registration.setRunAsRole("role");
|
||||
|
||||
@@ -51,14 +51,14 @@ public class DispatcherServletInitializerTests {
|
||||
|
||||
private Map<String, Servlet> servlets;
|
||||
|
||||
private Map<String, MockDynamic> registrations;
|
||||
private Map<String, MockServletRegistration> registrations;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
servletContext = new MyMockServletContext();
|
||||
initializer = new MyDispatcherServletInitializer();
|
||||
servlets = new LinkedHashMap<String, Servlet>(2);
|
||||
registrations = new LinkedHashMap<String, MockDynamic>(2);
|
||||
registrations = new LinkedHashMap<String, MockServletRegistration>(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -77,7 +77,7 @@ public class DispatcherServletInitializerTests {
|
||||
assertEquals(1, registrations.size());
|
||||
assertNotNull(registrations.get(SERVLET_NAME));
|
||||
|
||||
MockDynamic registration = registrations.get(SERVLET_NAME);
|
||||
MockServletRegistration registration = registrations.get(SERVLET_NAME);
|
||||
assertEquals(Collections.singleton(SERVLET_MAPPING), registration.getMappings());
|
||||
assertEquals(1, registration.getLoadOnStartup());
|
||||
assertEquals(ROLE_NAME, registration.getRunAsRole());
|
||||
@@ -89,7 +89,7 @@ public class DispatcherServletInitializerTests {
|
||||
public ServletRegistration.Dynamic addServlet(String servletName,
|
||||
Servlet servlet) {
|
||||
servlets.put(servletName, servlet);
|
||||
MockDynamic registration = new MockDynamic();
|
||||
MockServletRegistration registration = new MockServletRegistration();
|
||||
registrations.put(servletName, registration);
|
||||
return registration;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright 2002-2012 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.web.servlet.support;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.servlet.DispatcherType;
|
||||
import javax.servlet.FilterRegistration.Dynamic;
|
||||
|
||||
class MockFilterRegistration implements Dynamic {
|
||||
|
||||
private boolean asyncSupported = false;
|
||||
|
||||
private Map<String, EnumSet<DispatcherType>> mappings = new HashMap<String, EnumSet<DispatcherType>>();
|
||||
|
||||
|
||||
public Map<String, EnumSet<DispatcherType>> getMappings() {
|
||||
return this.mappings;
|
||||
}
|
||||
|
||||
public boolean isAsyncSupported() {
|
||||
return this.asyncSupported;
|
||||
}
|
||||
|
||||
public void setAsyncSupported(boolean isAsyncSupported) {
|
||||
this.asyncSupported = isAsyncSupported;
|
||||
}
|
||||
|
||||
public void addMappingForServletNames(EnumSet<DispatcherType> dispatcherTypes,
|
||||
boolean isMatchAfter, String... servletNames) {
|
||||
|
||||
for (String servletName : servletNames) {
|
||||
this.mappings.put(servletName, dispatcherTypes);
|
||||
}
|
||||
}
|
||||
|
||||
// Not implemented
|
||||
|
||||
public String getName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Collection<String> getServletNameMappings() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addMappingForUrlPatterns(EnumSet<DispatcherType> dispatcherTypes,
|
||||
boolean isMatchAfter, String... urlPatterns) {
|
||||
}
|
||||
|
||||
public Collection<String> getUrlPatternMappings() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getClassName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean setInitParameter(String name, String value) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public String getInitParameter(String name) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Set<String> setInitParameters(Map<String, String> initParameters) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Map<String, String> getInitParameters() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -26,7 +26,7 @@ import javax.servlet.MultipartConfigElement;
|
||||
import javax.servlet.ServletRegistration;
|
||||
import javax.servlet.ServletSecurityElement;
|
||||
|
||||
class MockDynamic implements ServletRegistration.Dynamic {
|
||||
class MockServletRegistration implements ServletRegistration.Dynamic {
|
||||
|
||||
private int loadOnStartup;
|
||||
|
||||
@@ -34,6 +34,8 @@ class MockDynamic implements ServletRegistration.Dynamic {
|
||||
|
||||
private String roleName;
|
||||
|
||||
private boolean asyncSupported = false;
|
||||
|
||||
public int getLoadOnStartup() {
|
||||
return loadOnStartup;
|
||||
}
|
||||
@@ -59,10 +61,16 @@ class MockDynamic implements ServletRegistration.Dynamic {
|
||||
return roleName;
|
||||
}
|
||||
|
||||
// not implemented
|
||||
public void setAsyncSupported(boolean isAsyncSupported) {
|
||||
this.asyncSupported = isAsyncSupported;
|
||||
}
|
||||
|
||||
public boolean isAsyncSupported() {
|
||||
return this.asyncSupported;
|
||||
}
|
||||
|
||||
// not implemented
|
||||
|
||||
public String getName() {
|
||||
return null;
|
||||
}
|
||||
Reference in New Issue
Block a user