Add support for excluding some URLs in Web Servlet CommonFilter (#914)
This commit is contained in:
parent
61c8397e48
commit
7dd20dd202
|
|
@ -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`.
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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…
Reference in New Issue