Solon

问题:为什么会出现多次请求输出?

</> markdown

比如输出了:

{"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() 做些控制与检查
  • 异常,可以由一个全局 过滤器 处理(避免出现“可能二”)[推荐]