这是一个 Web Aop 的注解（替代之前的 `@Before` 和 `@After`）

### 1、Action 内部结构详图

完整的Web[《请求处理过程示意图》](/article/242)。其中 Action （即 Controller 里的执行动作）内部结构图：

<img src="/img/e5a82779b6104f7da7eeff2a494c3919.png" width="400" />

@Addition 即应用在 “FilterChain” 处位置（为 Action 附加局部过滤器）。

### 2、关于过滤器的 "全局"、"局部"

* 全局控制（对所有请求有效）：

```java
public class App{
    public static void main(String[] args){
        Solon.start(App.class, args, app->{
            app.filter(new WhitelistFilter());
        });
    }
}
```

* 局部控制。且只作用在 Action 或 Controller 上。

```java
@Controller
public class UserController{
    @Addition(WhitelistFilter.class)
    @Mapping("/user/del")
    public void userDel(){ }
}
```


### 4、应用示例：局部请求白名单控制（Before）

定义白名单处理器

```java
public class WhitelistFilter implements Filter{
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        //bef do...
        chain.doFilter(ctx);
    }
}
```

使用 @Addition 进行附加（在 Action 的 method 执行之前，此时 method 的参数未解析。<mark>如果提前档住算是省性能了</mark>）

```java
@Controller
public class DemoController{
    //删除比较危险，加个白名单检查
    @Addition(WhitelistFilter.class)
    @Mapping("user/del")
    public void delUser(..){
    }
}
```

可以使用"注解继承"模式，用起来简洁些

```java
//将 @Addition 附加在 Whitelist 注解上；@Whitelist 就代表了 @Addition(WhitelistFilter.class)
@Addition(WhitelistFilter.class)
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Whitelist {
}


@Controller
public class DemoController{
    @Whitelist
    @Mapping("user/del")
    public void delUser(..){
    }
}
```

### 5、应用示例：局部请求日志记录（After）


定义日志处理器

```java
public class LoggingFilter implements Filter {
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        chain.doFilter(ctx);
        
        //aft do
        System.out.println((String) ctx.attr("output"));
    }
}
```

可以使用"注解继承"模式，用起来简洁些


```java
@Addition(LoggingFilter.class)
@Target({ElementType.METHOD, ElementType.TYPE}) //支持加在类或方法上
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Logging {
}


@Controller
public class DemoController{
    @Logging
    @Mapping("user/del")
    public void delUser(..){
    }
}
```

关于这个能力，也可以参考：[《统一的局部请求日志记录（即带注解的）》](/article/625)






