问题:如何处理 http 404 状态? - new
此内容适合 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!");
});
});
}
}