@Addition 使用说明(AOP)
这是一个 Web Aop 的注解(替代之前的 @Before
和 @After
)
1、Action 内部结构详图
完整的Web《请求处理过程示意图》。其中 Action (即 Controller 里的执行动作)内部结构图:
@Addition 即应用在 “FilterChain” 处位置(为 Action 附加局部过滤器)。
2、关于过滤器的 "全局"、"局部"
- 全局控制(对所有请求有效):
public class App{
public static void main(String[] args){
Solon.start(App.class, args, app->{
app.filter(new WhitelistFilter());
});
}
}
- 局部控制。且只作用在 Action 或 Controller 上。
@Controller
public class UserController{
@Addition(WhitelistFilter.class)
@Mapping("/user/del")
public void userDel(){ }
}
4、应用示例:局部请求白名单控制(Before)
定义白名单处理器
public class WhitelistFilter implements Filter{
@Override
public void doFilter(Context ctx, FilterChain chain) throws Throwable {
//bef do...
chain.doFilter(ctx);
}
}
使用 @Addition 进行附加(在 Action 的 method 执行之前,此时 method 的参数未解析。如果提前档住算是省性能了)
@Controller
public class DemoController{
//删除比较危险,加个白名单检查
@Addition(WhitelistFilter.class)
@Mapping("user/del")
public void delUser(..){
}
}
可以使用"注解继承"模式,用起来简洁些
//将 @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)
定义日志处理器
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"));
}
}
可以使用"注解继承"模式,用起来简洁些
@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(..){
}
}
关于这个能力,也可以参考:《统一的局部请求日志记录(即带注解的)》