Solon v3.0.3

问题:如何处理 http 404 状态? - new

</> markdown

此内容适合 v2.8.3 之后


http 404 输出的本质是:请求没有对应的处理,框架在最后做了自动转换的结果。http 500 则是,异常没有对应的处理,框架在最后做了自动转换的结果(道理差不多)。

理解这个本质很重要。所有,有两种方式可以处理 404 的情况:

1、在 404 状态转换之前

这个时候的特征是,没有主处理(或没有被处理)。但,还没有产生 404 状态。比如在 RouterInterceptor 里:

public class DemoRouterInterceptor implements RouterInterceptor {
    @Override
    public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
        //此时:当 mainHandler == null 时,就是没有主处理。
        if(mainHandler == null){
            //如果不需要再继承,就可以当 404 处理并返回了
            ctx.redirect("/404.htm");
            ctx.setHandled(true); //为了不被过滤器,误会。标为已处理
            return;
        }
        
        chain.doIntercept(ctx,mainHandler);
    }
}

再比如在过滤器里:

public class DemoFilter implements Filter {

    @Override
    public void doFilter(Context ctx, FilterChain chain) throws Throwable {
        try {
            chain.doFilter(ctx);
        } catch (StatusException e){
            if (e.getCode() == 404) {
                //如果不需要再继承,就可以当 404 处理并返回了
                ctx.redirect("/404.htm");
                return;
            }
        }
    }
}

也可以参考 《统一的异常处理》 的第二节,404 也可以当作一种异常,一并处理。

2、在 404 状态转换之后,添加 404 状态处理

如果你什么都没做,框架在最外层的处理会把它转为 404 状态。此时,可以借助全局的状态管理,添加状态处理:

@SolonMain
public class App {
    public static void main(String[] args) {
        Solon.start(App.class, args, app->{
            app.onStatus(404, ctx->{
                ctx.output("hi 404!");
            });
        });
    }
}