Skip to content

Commit

Permalink
Add support for excluding some URLs in Web Servlet CommonFilter (#914)
Browse files Browse the repository at this point in the history
  • Loading branch information
lym-ifae authored and sczyh30 committed Jul 16, 2019
1 parent 61c8397 commit 7dd20dd
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 13 deletions.
2 changes: 2 additions & 0 deletions sentinel-adapter/sentinel-web-servlet/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Original file line number Diff line number Diff line change
Expand Up @@ -73,19 +73,19 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public void testCommonFilterMiscellaneous() throws Exception {

// Test for url cleaner.
testUrlCleaner();

testUrlExclusion();
testCustomOriginParser();
}

Expand Down Expand Up @@ -139,6 +139,25 @@ public String clean(String originUrl) {
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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,9 @@ public String apiError() {
public String apiFoo(@PathVariable("id") Long id) {
return "Hello " + id;
}

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

0 comments on commit 7dd20dd

Please sign in to comment.