@@ -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; | |||
} | |||
} |