ability to have multiple path patterns per mapped interceptor definition
This commit is contained in:
@@ -37,16 +37,28 @@ import org.w3c.dom.Element;
|
||||
class InterceptorsBeanDefinitionParser implements BeanDefinitionParser {
|
||||
|
||||
public BeanDefinition parse(Element element, ParserContext parserContext) {
|
||||
List<Element> interceptors = DomUtils.getChildElementsByTagName(element, "interceptor");
|
||||
List<Element> interceptors = DomUtils.getChildElementsByTagName(element, new String[] { "bean", "interceptor" });
|
||||
for (Element interceptor : interceptors) {
|
||||
RootBeanDefinition mappedInterceptorDef = new RootBeanDefinition(MappedInterceptor.class);
|
||||
mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, interceptor.getAttribute("path"));
|
||||
RootBeanDefinition interceptorDef = new RootBeanDefinition(interceptor.getAttribute("class"));
|
||||
BeanDefinitionHolder holder = new BeanDefinitionHolder(interceptorDef, parserContext.getReaderContext().generateBeanName(interceptorDef));
|
||||
holder = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptor, holder);
|
||||
parserContext.getDelegate().parseConstructorArgElements(interceptor, interceptorDef);
|
||||
parserContext.getDelegate().parsePropertyElements(interceptor, interceptorDef);
|
||||
mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, holder);
|
||||
mappedInterceptorDef.setSource(parserContext.extractSource(interceptor));
|
||||
String[] pathPatterns;
|
||||
BeanDefinitionHolder interceptorDef;
|
||||
if ("interceptor".equals(interceptor.getLocalName())) {
|
||||
List<Element> paths = DomUtils.getChildElementsByTagName(interceptor, "path");
|
||||
pathPatterns = new String[paths.size()];
|
||||
for (int i = 0; i < paths.size(); i++) {
|
||||
pathPatterns[i] = paths.get(i).getAttribute("value");
|
||||
}
|
||||
Element interceptorBean = DomUtils.getChildElementByTagName(interceptor, "bean");
|
||||
interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptorBean);
|
||||
interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptorBean, interceptorDef);
|
||||
} else {
|
||||
pathPatterns = null;
|
||||
interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptor);
|
||||
interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptor, interceptorDef);
|
||||
}
|
||||
mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, pathPatterns);
|
||||
mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, interceptorDef);
|
||||
parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptorDef);
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -25,7 +25,7 @@ import org.springframework.web.servlet.HandlerInterceptor;
|
||||
*/
|
||||
public final class MappedInterceptor {
|
||||
|
||||
private final String pathPattern;
|
||||
private final String[] pathPatterns;
|
||||
|
||||
private final HandlerInterceptor interceptor;
|
||||
|
||||
@@ -34,8 +34,8 @@ public final class MappedInterceptor {
|
||||
* @param pathPattern the path pattern
|
||||
* @param interceptor the interceptor
|
||||
*/
|
||||
public MappedInterceptor(String pathPattern, HandlerInterceptor interceptor) {
|
||||
this.pathPattern = pathPattern;
|
||||
public MappedInterceptor(String[] pathPatterns, HandlerInterceptor interceptor) {
|
||||
this.pathPatterns = pathPatterns;
|
||||
this.interceptor = interceptor;
|
||||
}
|
||||
|
||||
@@ -44,16 +44,16 @@ public final class MappedInterceptor {
|
||||
* @param pathPattern the path pattern
|
||||
* @param interceptor the interceptor
|
||||
*/
|
||||
public MappedInterceptor(String pathPattern, WebRequestInterceptor interceptor) {
|
||||
this.pathPattern = pathPattern;
|
||||
public MappedInterceptor(String[] pathPatterns, WebRequestInterceptor interceptor) {
|
||||
this.pathPatterns = pathPatterns;
|
||||
this.interceptor = new WebRequestHandlerInterceptorAdapter(interceptor);
|
||||
}
|
||||
|
||||
/**
|
||||
* The path into the application the interceptor is mapped to.
|
||||
*/
|
||||
public String getPathPattern() {
|
||||
return pathPattern;
|
||||
public String[] getPathPatterns() {
|
||||
return pathPatterns;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,7 +4,6 @@ import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.util.PathMatcher;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
|
||||
class MappedInterceptors {
|
||||
@@ -26,9 +25,14 @@ class MappedInterceptors {
|
||||
}
|
||||
|
||||
private boolean matches(MappedInterceptor interceptor, String lookupPath, PathMatcher pathMatcher) {
|
||||
String pathPattern = interceptor.getPathPattern();
|
||||
if (StringUtils.hasText(pathPattern)) {
|
||||
return pathMatcher.match(pathPattern, lookupPath);
|
||||
String[] pathPatterns = interceptor.getPathPatterns();
|
||||
if (pathPatterns != null) {
|
||||
for (String pattern : pathPatterns) {
|
||||
if (pathMatcher.match(pattern, lookupPath)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user