Fix WebSocketHandlerMapping match for "/*"

Closes gh-34503
This commit is contained in:
rstoyanchev
2025-03-12 10:03:00 +00:00
parent 057742f27a
commit f8a82b46c1
3 changed files with 64 additions and 29 deletions

View File

@@ -72,6 +72,14 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i
private final Map<PathPattern, Object> pathPatternHandlerMap = new LinkedHashMap<>();
/**
* Handler for "/*", to be checked after all other handlers.
* Effectively similar to {@link #getDefaultHandler}, but processed at our level,
* within {@link #getHandlerInternal} where the request is available.
* @see org.springframework.web.socket.server.support.WebSocketHandlerMapping
*/
private @Nullable Object wildcardHandler;
@Override
public void setPatternParser(@Nullable PathPatternParser patternParser) {
@@ -166,9 +174,9 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i
}
else if (urlPath.equals("/*")) {
if (logger.isTraceEnabled()) {
logger.trace("Default mapping to " + getHandlerDescription(handler));
logger.trace("Wildcard mapping to " + getHandlerDescription(handler));
}
setDefaultHandler(resolvedHandler);
this.wildcardHandler = resolvedHandler;
}
else {
this.handlerMap.put(urlPath, resolvedHandler);
@@ -197,9 +205,9 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i
}
else if (urlPath.equals("/*")) {
if (logger.isTraceEnabled()) {
logger.trace("Removing default mapping: " + getDefaultHandler());
logger.trace("Removing wildcard mapping: " + getDefaultHandler());
}
setDefaultHandler(null);
this.wildcardHandler = null;
}
else {
Object mappedHandler = this.handlerMap.get(urlPath);
@@ -248,6 +256,9 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i
if (StringUtils.matchesCharacter(lookupPath, '/')) {
rawHandler = getRootHandler();
}
if (rawHandler == null) {
rawHandler = this.wildcardHandler;
}
if (rawHandler == null) {
rawHandler = getDefaultHandler();
}