Browse Source

Add support for excluding some URLs in Web Servlet CommonFilter (#914)

master
lym-ifae Eric Zhao 5 years ago
parent
commit
7dd20dd202
4 changed files with 39 additions and 13 deletions
  1. +2
    -0
      sentinel-adapter/sentinel-web-servlet/README.md
  2. +12
    -12
      sentinel-adapter/sentinel-web-servlet/src/main/java/com/alibaba/csp/sentinel/adapter/servlet/CommonFilter.java
  3. +20
    -1
      sentinel-adapter/sentinel-web-servlet/src/test/java/com/alibaba/csp/sentinel/adapter/servlet/CommonFilterTest.java
  4. +5
    -0
      sentinel-adapter/sentinel-web-servlet/src/test/java/com/alibaba/csp/sentinel/adapter/servlet/TestController.java

+ 2
- 0
sentinel-adapter/sentinel-web-servlet/README.md View File

@@ -51,6 +51,8 @@ block handler (the `UrlBlockHandler` interface) and register to `WebCallbackMana
The `UrlCleaner` interface is designed for clean and unify the URL resource.
For REST APIs, you have to clean the URL resource (e.g. `/foo/1` and `/foo/2` -> `/foo/:id`), or
the amount of context and resources will exceed the threshold.
The `UrlCleaner` interface can also exclude unused URLs(e.g. `/exclude/1` -> `/exclude/:id` -> `""`).
The URLs will be filtered and not be resource in this way.

`RequestOriginParser` interface is useful for extracting request origin (e.g. IP or appName from HTTP Header)
from HTTP request. You can implement your own `RequestOriginParser` and register to `WebCallbackManager`.

+ 12
- 12
sentinel-adapter/sentinel-web-servlet/src/main/java/com/alibaba/csp/sentinel/adapter/servlet/CommonFilter.java View File

@@ -73,19 +73,19 @@ public class CommonFilter implements Filter {
target = urlCleaner.clean(target);
}

// Parse the request origin using registered origin parser.
String origin = parseOrigin(sRequest);

ContextUtil.enter(target, origin);
entry = SphU.entry(target, EntryType.IN);


// Add method specification if necessary
if (httpMethodSpecify) {
methodEntry = SphU.entry(sRequest.getMethod().toUpperCase() + COLON + target,
EntryType.IN);
// If you intend to exclude some URLs, you can convert the URLs to the empty string ""
// in the UrlCleaner implementation.
if (!StringUtil.isEmpty(target)) {
// Parse the request origin using registered origin parser.
String origin = parseOrigin(sRequest);
ContextUtil.enter(target, origin);
entry = SphU.entry(target, EntryType.IN);
// Add method specification if necessary
if (httpMethodSpecify) {
methodEntry = SphU.entry(sRequest.getMethod().toUpperCase() + COLON + target,
EntryType.IN);
}
}

chain.doFilter(request, response);
} catch (BlockException e) {
HttpServletResponse sResponse = (HttpServletResponse) response;


+ 20
- 1
sentinel-adapter/sentinel-web-servlet/src/test/java/com/alibaba/csp/sentinel/adapter/servlet/CommonFilterTest.java View File

@@ -89,7 +89,7 @@ public class CommonFilterTest {

// Test for url cleaner.
testUrlCleaner();
testUrlExclusion();
testCustomOriginParser();
}

@@ -139,6 +139,25 @@ public class CommonFilterTest {
WebCallbackManager.setUrlCleaner(new DefaultUrlCleaner());
}

private void testUrlExclusion() throws Exception {
final String excludePrefix = "/exclude/";
String url = excludePrefix + 1;
WebCallbackManager.setUrlCleaner(new UrlCleaner() {
@Override
public String clean(String originUrl) {
if(originUrl.startsWith(excludePrefix)) {
return "";
}
return originUrl;
}
});
this.mvc.perform(get(url).accept(MediaType.TEXT_PLAIN))
.andExpect(status().isOk())
.andExpect(content().string("Exclude 1"));
assertNull(ClusterBuilderSlot.getClusterNode(url));
WebCallbackManager.setUrlCleaner(new DefaultUrlCleaner());
}

private void testCustomOriginParser() throws Exception {
String url = "/hello";
String limitOrigin = "userA";


+ 5
- 0
sentinel-adapter/sentinel-web-servlet/src/test/java/com/alibaba/csp/sentinel/adapter/servlet/TestController.java View File

@@ -39,4 +39,9 @@ public class TestController {
public String apiFoo(@PathVariable("id") Long id) {
return "Hello " + id;
}

@GetMapping("/exclude/{id}")
public String apiExclude(@PathVariable("id") Long id) {
return "Exclude " + id;
}
}

Loading…
Cancel
Save