Add "web-context-unify" config in Spring WebMVC adapter to support "chain" relation flow strategy (#1328)
This commit is contained in:
parent
51331879af
commit
2c2f60cf58
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue