Browse Source

Fix the bug that context was not released when blocked in Spring Web adapter (#1353)

master
cdfive GitHub 4 years ago
parent
commit
43b5e65ab3
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 4 deletions
  1. +5
    -1
      sentinel-adapter/sentinel-spring-webmvc-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/spring/webmvc/AbstractSentinelInterceptor.java
  2. +6
    -3
      sentinel-adapter/sentinel-spring-webmvc-adapter/src/test/java/com/alibaba/csp/sentinel/adapter/spring/webmvc/SentinelSpringMvcIntegrationTest.java

+ 5
- 1
sentinel-adapter/sentinel-spring-webmvc-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/spring/webmvc/AbstractSentinelInterceptor.java View File

@@ -67,7 +67,11 @@ public abstract class AbstractSentinelInterceptor implements HandlerInterceptor
}
return true;
} catch (BlockException e) {
handleBlockException(request, response, e);
try {
handleBlockException(request, response, e);
} finally {
ContextUtil.exit();
}
return false;
}
}


+ 6
- 3
sentinel-adapter/sentinel-spring-webmvc-adapter/src/test/java/com/alibaba/csp/sentinel/adapter/spring/webmvc/SentinelSpringMvcIntegrationTest.java View File

@@ -71,18 +71,21 @@ public class SentinelSpringMvcIntegrationTest {
final String headerName = "S-User";
configureRulesFor(springMvcPathVariableUrl, 0, limitOrigin);

// This will be passed since the caller is different: userB
this.mvc.perform(get("/foo/1").accept(MediaType.TEXT_PLAIN).header(headerName, "userB"))
.andExpect(status().isOk())
.andExpect(content().string("foo 1"));

// This will be blocked and reponse json.
// This will be blocked since the caller is same: userA
this.mvc.perform(
get("/foo/2").accept(MediaType.APPLICATION_JSON).header(headerName, limitOrigin))
.andExpect(status().isOk())
.andExpect(content().json(ResultWrapper.blocked().toJsonString()));

// This will be passed since the caller is different: ""
this.mvc.perform(get("/foo/3").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(ResultWrapper.blocked().toJsonString()));
.andExpect(content().string("foo 3"));

FlowRuleManager.loadRules(null);
}
@@ -115,7 +118,7 @@ public class SentinelSpringMvcIntegrationTest {
assertEquals(i + 1, cn.passQps(), 0.01);
}

// This will be blocked and reponse json.
// This will be blocked and response json.
this.mvc.perform(get(url))
.andExpect(status().isOk())
.andExpect(content().string(ResultWrapper.blocked().toJsonString()));


Loading…
Cancel
Save