@@ -97,6 +97,7 @@ config.setBlockExceptionHandler((request, response, e) -> { | |||||
| urlCleaner | The `UrlCleaner` interface is designed for clean and unify the URL resource. | `UrlCleaner` | - | | | urlCleaner | The `UrlCleaner` interface is designed for clean and unify the URL resource. | `UrlCleaner` | - | | ||||
| requestAttributeName | Attribute key in request used by Sentinel (internal) | `String` | `$$sentinel_spring_web_entry_attr` | | | requestAttributeName | Attribute key in request used by Sentinel (internal) | `String` | `$$sentinel_spring_web_entry_attr` | | ||||
| httpMethodSpecify | Specify whether the URL resource name should contain the HTTP method prefix (e.g. `POST:`). | `boolean` | `false` | | | httpMethodSpecify | Specify whether the URL resource name should contain the HTTP method prefix (e.g. `POST:`). | `boolean` | `false` | | ||||
| webContextUnify | Specify whether unify web context(i.e. use the default context name). | `boolean` | `true` | | |||||
- `SentinelWebMvcTotalConfig` configuration: | - `SentinelWebMvcTotalConfig` configuration: | ||||
@@ -59,7 +59,8 @@ public abstract class AbstractSentinelInterceptor implements HandlerInterceptor | |||||
if (StringUtil.isNotEmpty(resourceName)) { | if (StringUtil.isNotEmpty(resourceName)) { | ||||
// Parse the request origin using registered origin parser. | // Parse the request origin using registered origin parser. | ||||
String origin = parseOrigin(request); | String origin = parseOrigin(request); | ||||
ContextUtil.enter(SENTINEL_SPRING_WEB_CONTEXT_NAME, origin); | |||||
String contextName = getContextName(request); | |||||
ContextUtil.enter(contextName, origin); | |||||
Entry entry = SphU.entry(resourceName, ResourceTypeConstants.COMMON_WEB, EntryType.IN); | Entry entry = SphU.entry(resourceName, ResourceTypeConstants.COMMON_WEB, EntryType.IN); | ||||
setEntryInRequest(request, baseWebMvcConfig.getRequestAttributeName(), entry); | setEntryInRequest(request, baseWebMvcConfig.getRequestAttributeName(), entry); | ||||
@@ -79,6 +80,16 @@ public abstract class AbstractSentinelInterceptor implements HandlerInterceptor | |||||
*/ | */ | ||||
protected abstract String getResourceName(HttpServletRequest request); | protected abstract String getResourceName(HttpServletRequest request); | ||||
/** | |||||
* Return the context name of the target web resource. | |||||
* | |||||
* @param request web request | |||||
* @return the context name of the target web resource. | |||||
*/ | |||||
protected String getContextName(HttpServletRequest request) { | |||||
return SENTINEL_SPRING_WEB_CONTEXT_NAME; | |||||
} | |||||
@Override | @Override | ||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, | ||||
Object handler, Exception ex) throws Exception { | Object handler, Exception ex) throws Exception { | ||||
@@ -66,4 +66,12 @@ public class SentinelWebInterceptor extends AbstractSentinelInterceptor { | |||||
return resourceName; | return resourceName; | ||||
} | } | ||||
@Override | |||||
protected String getContextName(HttpServletRequest request) { | |||||
if (config.isWebContextUnify()) { | |||||
return super.getContextName(request); | |||||
} | |||||
return getResourceName(request); | |||||
} | |||||
} | } |
@@ -29,11 +29,19 @@ public class SentinelWebMvcConfig extends BaseWebMvcConfig { | |||||
* Specify the URL cleaner that unifies the URL resources. | * Specify the URL cleaner that unifies the URL resources. | ||||
*/ | */ | ||||
private UrlCleaner urlCleaner; | private UrlCleaner urlCleaner; | ||||
/** | /** | ||||
* Specify whether the URL resource name should contain the HTTP method prefix (e.g. {@code POST:}). | * Specify whether the URL resource name should contain the HTTP method prefix (e.g. {@code POST:}). | ||||
*/ | */ | ||||
private boolean httpMethodSpecify; | private boolean httpMethodSpecify; | ||||
/** | |||||
* Specify whether unify web context(i.e. use the default context name), and is true by default. | |||||
* | |||||
* @since 1.7.2 | |||||
*/ | |||||
private boolean webContextUnify = true; | |||||
public SentinelWebMvcConfig() { | public SentinelWebMvcConfig() { | ||||
super(); | super(); | ||||
setRequestAttributeName(DEFAULT_REQUEST_ATTRIBUTE_NAME); | setRequestAttributeName(DEFAULT_REQUEST_ATTRIBUTE_NAME); | ||||
@@ -57,11 +65,21 @@ public class SentinelWebMvcConfig extends BaseWebMvcConfig { | |||||
return this; | return this; | ||||
} | } | ||||
public boolean isWebContextUnify() { | |||||
return webContextUnify; | |||||
} | |||||
public SentinelWebMvcConfig setWebContextUnify(boolean webContextUnify) { | |||||
this.webContextUnify = webContextUnify; | |||||
return this; | |||||
} | |||||
@Override | @Override | ||||
public String toString() { | public String toString() { | ||||
return "SentinelWebMvcConfig{" + | return "SentinelWebMvcConfig{" + | ||||
"urlCleaner=" + urlCleaner + | "urlCleaner=" + urlCleaner + | ||||
", httpMethodSpecify=" + httpMethodSpecify + | ", httpMethodSpecify=" + httpMethodSpecify + | ||||
", webContextUnify=" + webContextUnify + | |||||
", requestAttributeName='" + requestAttributeName + '\'' + | ", requestAttributeName='" + requestAttributeName + '\'' + | ||||
", blockExceptionHandler=" + blockExceptionHandler + | ", blockExceptionHandler=" + blockExceptionHandler + | ||||
", originParser=" + originParser + | ", originParser=" + originParser + | ||||
@@ -66,6 +66,7 @@ public class InterceptorConfig implements WebMvcConfigurer { | |||||
//Custom configuration if necessary | //Custom configuration if necessary | ||||
config.setHttpMethodSpecify(false); | config.setHttpMethodSpecify(false); | ||||
config.setWebContextUnify(true); | |||||
config.setOriginParser(new RequestOriginParser() { | config.setOriginParser(new RequestOriginParser() { | ||||
@Override | @Override | ||||
public String parseOrigin(HttpServletRequest request) { | public String parseOrigin(HttpServletRequest request) { | ||||
@@ -54,7 +54,7 @@ public class CommonFilter implements Filter { | |||||
*/ | */ | ||||
public static final String HTTP_METHOD_SPECIFY = "HTTP_METHOD_SPECIFY"; | public static final String HTTP_METHOD_SPECIFY = "HTTP_METHOD_SPECIFY"; | ||||
/** | /** | ||||
* If enabled, use the URL path as the context name, or else use the default | |||||
* If enabled, use the default context name, or else use the URL path as the context name, | |||||
* {@link WebServletConfig#WEB_SERVLET_CONTEXT_NAME}. Please pay attention to the number of context (EntranceNode), | * {@link WebServletConfig#WEB_SERVLET_CONTEXT_NAME}. Please pay attention to the number of context (EntranceNode), | ||||
* which may affect the memory footprint. | * which may affect the memory footprint. | ||||
* | * | ||||
@@ -53,6 +53,12 @@ public class InterceptorConfig implements WebMvcConfigurer { | |||||
// Custom configuration if necessary | // Custom configuration if necessary | ||||
config.setHttpMethodSpecify(true); | config.setHttpMethodSpecify(true); | ||||
// By default web context is true, means that unify web context(i.e. use the default context name), | |||||
// in most scenarios that's enough, and it could reduce the memory footprint. | |||||
// If set it to false, entrance contexts will be separated by different URLs, | |||||
// which is useful to support "chain" relation flow strategy. | |||||
// We can change it and view different result in `Resource Chain` menu of dashboard. | |||||
config.setWebContextUnify(true); | |||||
config.setOriginParser(request -> request.getHeader("S-user")); | config.setOriginParser(request -> request.getHeader("S-user")); | ||||
// Add sentinel interceptor | // Add sentinel interceptor | ||||