# Sentinel Spring MVC Interceptor
Sentinel provides Spring MVC Interceptor integration to enable flow control for web requests, And support url like '/foo/{id}'
Add the following dependency in `pom.xml` (if you are using Maven):
```xml
com.alibaba.csp
sentinel-spring-webmvc-adapter
x.y.z
```
Configure interceptor
```java
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//Add sentinel interceptor
addSpringMvcInterceptor(registry);
//If you want to sentinel the total flow, you can add total interceptor
addSpringMvcTotalInterceptor(registry);
}
private void addSpringMvcInterceptor(InterceptorRegistry registry) {
//Configure
SentinelWebMvcConfig config = new SentinelWebMvcConfig();
//Custom configuration if necessary
config.setHttpMethodSpecify(true);
config.setOriginParser(request -> request.getHeader("S-user"));
//Add sentinel interceptor
registry.addInterceptor(new SentinelInterceptor(config)).addPathPatterns("/**");
}
private void addSpringMvcTotalInterceptor(InterceptorRegistry registry) {
//Configure
SentinelWebMvcTotalConfig config = new SentinelWebMvcTotalConfig();
//Custom configuration if necessary
config.setRequestAttributeName("my_sentinel_spring_mvc_total_entity_container");
config.setTotalResourceName("my-spring-mvc-total-url-request");
//Add sentinel interceptor
registry.addInterceptor(new SentinelTotalInterceptor(config)).addPathPatterns("/**");
}
}
```
Configure 'BlockException' handler, there are three options:
1. Global exception handling in spring MVC.
```java
@ControllerAdvice
@Order(0)
public class SentinelSpringMvcBlockHandlerConfig {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(BlockException.class)
@ResponseBody
public String sentinelBlockHandler(BlockException e) {
AbstractRule rule = e.getRule();
logger.info("Blocked by sentinel, {}", rule.toString());
return "Blocked by Sentinel";
}
}
```
2. Use `DefaultBlockExceptionHandler`
```java
//SentinelWebMvcTotalConfig config = new SentinelWebMvcTotalConfig();
SentinelWebMvcConfig config = new SentinelWebMvcConfig();
config.setBlockExceptionHandler(new DefaultBlockExceptionHandler());
```
3. `implements BlockExceptionHandler`
```java
//SentinelWebMvcTotalConfig config = new SentinelWebMvcTotalConfig();
SentinelWebMvcConfig config = new SentinelWebMvcConfig();
config.setBlockExceptionHandler((request, response, e) -> {
String resourceName = e.getRule().getResource();
//Depending on your situation, you can choose to process or throw
if ("/hello".equals(resourceName)) {
//Do something ......
//Write string or error page;
response.getWriter().write("Blocked by sentinel");
} else {
//Handle it in global exception handling
throw e;
}
});
```
Configuration
- Common configuration in `SentinelWebMvcConfig` and `SentinelWebMvcTotalConfig`
| name | description | type | default value |
|------|------------|------|-------|
| blockExceptionHandler| The handler when blocked by sentinel, there are three options:
1. The default value is null, you can hanlde `BlockException` in spring MVC;
2.Use `DefaultBlockExceptionHandler`;
3. `implements BlockExceptionHandler` | `BlockExceptionHandler` | `null` |
| originParser | `RequestOriginParser` interface is useful for extracting request origin (e.g. IP or appName from HTTP Header) from HTTP request | `RequestOriginParser` | `null` |
- `SentinelWebMvcConfig` configuration
| name | description | type | default value |
|------|------------|------|-------|
| urlCleaner | The `UrlCleaner` interface is designed for clean and unify the URL resource. For REST APIs, you can to clean the URL resource (e.g. `/api/user/getById` and `/api/user/getByName` -> `/api/user/getBy*`), avoid the amount of context and will exceed the threshold | `UrlCleaner` | `null` |
| requestAttributeName | Attribute name in request used by sentinel, please check record log, if it is already used, please set | `String` | sentinel_spring_mvc_entry_container |
| httpMethodSpecify | Specify http method, for example: GET:/hello | `boolean` | `false` |
`SentinelWebMvcTotalConfig` configuration
| name | description | type | default value |
|------|------------|------|-------|
| totalResourceName | The resource name in `SentinelTotalInterceptor` | `String` | spring-mvc-total-url-request |
| requestAttributeName | Attribute name in request used by sentinel, please check record log, if it is already used, please set | `String` | sentinel_spring_mvc_total_entry_container |