ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Solon Web 开发,六、过滤器、处理、拦截器

2022-01-19 08:33:56  阅读:186  来源: 互联网

标签:Web 拦截器 Solon 处理 Tran ctx class public


1、过滤器,全局请求的管控(Filter)

完整的Web处理,会经过三个路段:过滤器->处理者->拦截器。具体可以再看看《想法与架构笔记》关于请求的处理过程。

过滤器,一般用于:

  • 全局的请求异常处理
  • 性能记时
  • 响应状态调整
  • 上下文日志记录
  • 链路跟踪等...
@Slf4j
@Component
public class AppFilter implements Filter {
    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        //1.开始计时(用于计算响应时长)
        long start = System.currentTimeMillis();
        try {
            chain.doFilter(ctx);

            //2.未处理设为404状态
            if(! ctx.getHandled()){
                ctx.status(404);
            }
            
            //3.404状态的定制(也可对别的状态处理)
            if (ctx.status() == 404) { 
                ctx.setHandled(true);
                ctx.output("没有:(");
            }
        } catch (Throwable e) {
            //4.异常捕促与控制
            log.error(e);
        }

        //5.获得接口响应时长
        long times = System.currentTimeMillis() - start;
        System.out.println("用时:"+ times);
    }
}  

2、处理者,争对请求的具体路径的处理(Handler)

可以用Handler的模式写,也可以用Controller的模式写(Action 也是 Handler)。

处理者分为:

类型 说明
前置处理者 一般做些验证或检测工作,有一定的拦阻效果
主处理者 默认都是这种
后置处理者 一般是做些补充工作
// handler模式(前置处理)。
//
Solon.global().before("/hello/", ctx->{
    if(ctx.param("name") == null){    
        ctx.setHandled(true);    //如果没有name, 则终止处理
    }
});

// controller模式
//
@Controller
public class HelloInterceptor  {
    //(申明前置处理)
    @Mapping(value = "/hello/" , before = true)   
    public void handle(Context ctx, String name) {
        if(name == null){            
            ctx.setHandled(true);  //如果没有name, 则终止处理
        }
    }
}

3、拦截器,对Method拦截(Interceptor)

只有被动态代理的Bean,才能对Method进行拦截。一般用于切面开发,用注解做为切点配合起来用。比如缓存控制注解@Cache、事务控制注解@Tran等。

//定义事务拦截器
public class TranInterceptor implements Interceptor {
    @Override
    public Object doIntercept(Invocation inv) throws Throwable{
        ValHolder val0 = new ValHolder();

        Tran anno = inv.method().getAnnotation(Tran.class);
        TranExecutorImp.global.execute(anno, () -> {
            val0.value = inv.invoke();
        });

        return val0.value;
    }
}

//将拦截器注册到容器
Aop.context().beanAroundAdd(Tran.class, new TranInterceptor(), 120);

//应用示例(目前:@Controller、@Service、@Dao 注解的类,都是被动态代理的)
@Service
public class DemoService{
    @Inject
    UserMapper userMapper;
    
    @Tran
    public void add(User user){
        userMapper.add(user);
    }
}

标签:Web,拦截器,Solon,处理,Tran,ctx,class,public
来源: https://www.cnblogs.com/noear/p/15820803.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有