From 570074259d380a9160e9e9d388ad63b3f9bfad57 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Mon, 11 Dec 2023 10:24:39 +0000 Subject: [PATCH] Minor updates in HandlerMappingIntrospector Required by Spring Security to complete work on https://github.com/spring-projects/spring-security/issues/14128 The setCache and resetCache methods used from createCacheFilter are now public. Generally they don't need to be used outside of the Filter if only making checks against the current request. Spring Security, however, makes additional checks against requests with alternative paths. --- .../handler/HandlerMappingIntrospector.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java index 3e4a184049d..18ecb7796f1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java @@ -191,8 +191,12 @@ public class HandlerMappingIntrospector public Filter createCacheFilter() { return (request, response, chain) -> { CachedResult previous = setCache((HttpServletRequest) request); - chain.doFilter(request, response); - resetCache(request, previous); + try { + chain.doFilter(request, response); + } + finally { + resetCache(request, previous); + } }; } @@ -206,7 +210,7 @@ public class HandlerMappingIntrospector * @since 6.0.14 */ @Nullable - private CachedResult setCache(HttpServletRequest request) { + public CachedResult setCache(HttpServletRequest request) { CachedResult previous = (CachedResult) request.getAttribute(CACHED_RESULT_ATTRIBUTE); if (previous == null || !previous.matches(request)) { HttpServletRequest wrapped = new AttributesPreservingRequest(request); @@ -245,7 +249,7 @@ public class HandlerMappingIntrospector * a filter after delegating to the rest of the chain. * @since 6.0.14 */ - private void resetCache(ServletRequest request, @Nullable CachedResult cachedResult) { + public void resetCache(ServletRequest request, @Nullable CachedResult cachedResult) { request.setAttribute(CACHED_RESULT_ATTRIBUTE, cachedResult); } @@ -363,7 +367,7 @@ public class HandlerMappingIntrospector * @since 6.0.14 */ @SuppressWarnings("serial") - private static final class CachedResult { + public static final class CachedResult { private final DispatcherType dispatcherType;