@@ -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. | 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 | 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 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) | `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`. | 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); | 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); | chain.doFilter(request, response); | ||||
} catch (BlockException e) { | } catch (BlockException e) { | ||||
HttpServletResponse sResponse = (HttpServletResponse) response; | HttpServletResponse sResponse = (HttpServletResponse) response; | ||||
@@ -89,7 +89,7 @@ public class CommonFilterTest { | |||||
// Test for url cleaner. | // Test for url cleaner. | ||||
testUrlCleaner(); | testUrlCleaner(); | ||||
testUrlExclusion(); | |||||
testCustomOriginParser(); | testCustomOriginParser(); | ||||
} | } | ||||
@@ -139,6 +139,25 @@ public class CommonFilterTest { | |||||
WebCallbackManager.setUrlCleaner(new DefaultUrlCleaner()); | 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 { | private void testCustomOriginParser() throws Exception { | ||||
String url = "/hello"; | String url = "/hello"; | ||||
String limitOrigin = "userA"; | String limitOrigin = "userA"; | ||||
@@ -39,4 +39,9 @@ public class TestController { | |||||
public String apiFoo(@PathVariable("id") Long id) { | public String apiFoo(@PathVariable("id") Long id) { | ||||
return "Hello " + id; | return "Hello " + id; | ||||
} | } | ||||
@GetMapping("/exclude/{id}") | |||||
public String apiExclude(@PathVariable("id") Long id) { | |||||
return "Exclude " + id; | |||||
} | |||||
} | } |