/*
 * Copyright 2002-2018 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.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
import org.springframework.util.PathMatcher;
import org.springframework.web.context.request.WebRequestInterceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

Contains and delegates calls to a HandlerInterceptor along with include (and optionally exclude) path patterns to which the interceptor should apply. Also provides matching logic to test if the interceptor applies to a given request path.

A MappedInterceptor can be registered directly with any AbstractHandlerMethodMapping. Furthermore, beans of type MappedInterceptor are automatically detected by AbstractHandlerMethodMapping (including ancestor ApplicationContext's) which effectively means the interceptor is registered "globally" with all handler mappings.

Author:Keith Donald, Rossen Stoyanchev, Brian Clozel
Since:3.0
/** * Contains and delegates calls to a {@link HandlerInterceptor} along with * include (and optionally exclude) path patterns to which the interceptor should apply. * Also provides matching logic to test if the interceptor applies to a given request path. * * <p>A MappedInterceptor can be registered directly with any * {@link org.springframework.web.servlet.handler.AbstractHandlerMethodMapping}. * Furthermore, beans of type {@code MappedInterceptor} are automatically detected by * {@code AbstractHandlerMethodMapping} (including ancestor ApplicationContext's) which * effectively means the interceptor is registered "globally" with all handler mappings. * * @author Keith Donald * @author Rossen Stoyanchev * @author Brian Clozel * @since 3.0 */
public final class MappedInterceptor implements HandlerInterceptor { @Nullable private final String[] includePatterns; @Nullable private final String[] excludePatterns; private final HandlerInterceptor interceptor; @Nullable private PathMatcher pathMatcher;
Create a new MappedInterceptor instance.
Params:
  • includePatterns – the path patterns to map (empty for matching to all paths)
  • interceptor – the HandlerInterceptor instance to map to the given patterns
/** * Create a new MappedInterceptor instance. * @param includePatterns the path patterns to map (empty for matching to all paths) * @param interceptor the HandlerInterceptor instance to map to the given patterns */
public MappedInterceptor(@Nullable String[] includePatterns, HandlerInterceptor interceptor) { this(includePatterns, null, interceptor); }
Create a new MappedInterceptor instance.
Params:
  • includePatterns – the path patterns to map (empty for matching to all paths)
  • excludePatterns – the path patterns to exclude (empty for no specific excludes)
  • interceptor – the HandlerInterceptor instance to map to the given patterns
/** * Create a new MappedInterceptor instance. * @param includePatterns the path patterns to map (empty for matching to all paths) * @param excludePatterns the path patterns to exclude (empty for no specific excludes) * @param interceptor the HandlerInterceptor instance to map to the given patterns */
public MappedInterceptor(@Nullable String[] includePatterns, @Nullable String[] excludePatterns, HandlerInterceptor interceptor) { this.includePatterns = includePatterns; this.excludePatterns = excludePatterns; this.interceptor = interceptor; }
Create a new MappedInterceptor instance.
Params:
  • includePatterns – the path patterns to map (empty for matching to all paths)
  • interceptor – the WebRequestInterceptor instance to map to the given patterns
/** * Create a new MappedInterceptor instance. * @param includePatterns the path patterns to map (empty for matching to all paths) * @param interceptor the WebRequestInterceptor instance to map to the given patterns */
public MappedInterceptor(@Nullable String[] includePatterns, WebRequestInterceptor interceptor) { this(includePatterns, null, interceptor); }
Create a new MappedInterceptor instance.
Params:
  • includePatterns – the path patterns to map (empty for matching to all paths)
  • excludePatterns – the path patterns to exclude (empty for no specific excludes)
  • interceptor – the WebRequestInterceptor instance to map to the given patterns
/** * Create a new MappedInterceptor instance. * @param includePatterns the path patterns to map (empty for matching to all paths) * @param excludePatterns the path patterns to exclude (empty for no specific excludes) * @param interceptor the WebRequestInterceptor instance to map to the given patterns */
public MappedInterceptor(@Nullable String[] includePatterns, @Nullable String[] excludePatterns, WebRequestInterceptor interceptor) { this(includePatterns, excludePatterns, new WebRequestHandlerInterceptorAdapter(interceptor)); }
Configure a PathMatcher to use with this MappedInterceptor instead of the one passed by default to the matches(String, PathMatcher) method.

This is an advanced property that is only required when using custom PathMatcher implementations that support mapping metadata other than the Ant-style path patterns supported by default.

/** * Configure a PathMatcher to use with this MappedInterceptor instead of the one passed * by default to the {@link #matches(String, org.springframework.util.PathMatcher)} method. * <p>This is an advanced property that is only required when using custom PathMatcher * implementations that support mapping metadata other than the Ant-style path patterns * supported by default. */
public void setPathMatcher(@Nullable PathMatcher pathMatcher) { this.pathMatcher = pathMatcher; }
The configured PathMatcher, or null if none.
/** * The configured PathMatcher, or {@code null} if none. */
@Nullable public PathMatcher getPathMatcher() { return this.pathMatcher; }
The path into the application the interceptor is mapped to.
/** * The path into the application the interceptor is mapped to. */
@Nullable public String[] getPathPatterns() { return this.includePatterns; }
The actual HandlerInterceptor reference.
/** * The actual {@link HandlerInterceptor} reference. */
public HandlerInterceptor getInterceptor() { return this.interceptor; }
Determine a match for the given lookup path.
Params:
  • lookupPath – the current request path
  • pathMatcher – a path matcher for path pattern matching
Returns:true if the interceptor applies to the given request path
/** * Determine a match for the given lookup path. * @param lookupPath the current request path * @param pathMatcher a path matcher for path pattern matching * @return {@code true} if the interceptor applies to the given request path */
public boolean matches(String lookupPath, PathMatcher pathMatcher) { PathMatcher pathMatcherToUse = (this.pathMatcher != null ? this.pathMatcher : pathMatcher); if (!ObjectUtils.isEmpty(this.excludePatterns)) { for (String pattern : this.excludePatterns) { if (pathMatcherToUse.match(pattern, lookupPath)) { return false; } } } if (ObjectUtils.isEmpty(this.includePatterns)) { return true; } for (String pattern : this.includePatterns) { if (pathMatcherToUse.match(pattern, lookupPath)) { return true; } } return false; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return this.interceptor.preHandle(request, response, handler); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { this.interceptor.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { this.interceptor.afterCompletion(request, response, handler, ex); } }