Solon v3.6.3

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

</> markdown

比如输出了:

{"code":403,"description":"No role grantd","data":4}{"code":400}

先了解一下:完整的Web《请求处理过程示意图》。在示意图中的任何一个环节,都是有可能进行响应输出的,从而造成非期望的结果。

比如这个简单的例子,就可以造成上面的输出效果:

App.class

import org.noear.solon.Solon;

public class App{
    public static void main(String[] args){
        Solon.start(App.class, args, app->{
            app.filter((ctx,chain)->{
                chain.doFilter(ctx);
                ctx.output("{\"code\":400}");
            });
        });
    }
}

DemoController.class

import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.core.handle.Result;

@Controller
public class DemoController{
    @Mapping("/test")
    public Object test(){
        return Result.failure(403, "No role grantd");
    }
}

一般来讲,大家不会这么写代码。而造成这种输出的“常见场景”是对某某异常的处理:

建议

  • 多注意细节
  • 可以借助 ctx.getHandled(), ctx.getRendered() 做些控制与检查
  • 异常,可以由一个全局 过滤器 处理(避免出现“可能二”)[推荐]