问题:为什么会出现多次请求输出?
比如输出了:
{"code":403,"description":"No role grantd","data":4}{"code":400}
先了解一下:完整的Web《请求处理过程示意图》。在示意图中的任何一个环节,都是有可能进行响应输出的,从而造成非期望的结果。
比如这个简单的例子,就可以造成上面的输出效果:
@SolonMain
public class App{
public static void main(String[] args){
Solon.start(App.class, args, app->{
app.after(ctx -> ctx.output("{\"code\":400}"));
})
}
}
@Controller
public class DemoController{
@Mapping("/test")
public Object test(){
return Result.failure(403, "No role grantd");
}
}
一般来讲,大家不会这么写代码。而造成这种输出的“常见场景”是对某某异常的处理:
1、案例模拟
比如下面这块代码,要求管理员才能访问。。。当不是管理员时,就会出异常。
@Controller
public class DemoController{
@Auth(Role.admin)
@Mapping("/test")
public Object test(){
return Result.failure(403, "No role grantd");
}
}
- 可能一:
当首次捕获异常的代码,做了输出处理,但是它没有吃掉异常,让异常向上透传了;当第二次捕获异常时,又做了一次输出。。。这样就产生两次输出了。
- 可能二:
当首次捕获异常的代码,做了输出处理,并吃掉了异常;但后续的某些处理再次出现了异常;这后面出现的异常时,被捕获时,又做了输出处理。。。这样也产生一两次输出了。
2、建议
- 多注意细节
- 可以借助 ctx.getHandled(), ctx.getRendered() 做些控制与检查
- 异常,可以由一个全局 过滤器 处理(避免出现“可能二”)[推荐]