关于如何监听到render(“页面地址”)的错误信息?

如何监听到render(“页面地址”)的错误信息?

错误信息主要有两点:

  1. render(“页面地址”)报 File not found,也就是文件找不到。

  2. 渲染成功后,在页面中使用了模板引擎出现的报错。


关于这两点报错怎么监听到呢?(只有监听到才能把错误信息返回前台提示用户相应的信息)求大佬指教一下

评论区

JFinal

2019-08-30 09:42

日志里面会有这类信息

不建议将这类信息响应到客户端,攻击者可以利用这个功能有针对性攻击,在出异常时响应 500 页面、404 页面即可

如果一定要显示这类异常,做一个全局拦截器即可,大致代码:
try {
inv.invoke();
} catch( Exception e) {
inv.getController().setAttr("errorMsg", e.getMessage());
inv.getController().render("error.html");
}


如果你是希望将错误输出为 json ,可以这样:
inv.getController().renderJson("errorMsg", e.getMessage());

66666666

2019-08-30 09:56

@JFinal 波总,这个全局拦截器我配置了的,但是监听不到java.lang.RuntimeException: File not found 页面,这个报错呢,是什么情况?

66666666

2019-08-30 09:58

@JFinal 我放代码吧:
try{
inv.invoke();
}catch(Exception e){
logger.error(e.getMessage());
e.printStackTrace();
/*判断请求是否为ajax请求*/
if(isAjax(inv)){
MessageModel msg = new MessageModel();
msg.setSuccess(false);
msg.setMsg("系统错误");
inv.getController().renderJson(msg);
}else{
inv.getController().render("/webapp/views/common/error.html");
}
}

JFinal

2019-08-30 10:18

render 时的错误在拦截器中获取不到,我前面给的方案是获取 controller 以及 interceptor、以及业务层的异常

如果你想获取 render 中的异常,继承 RenderFactory, 覆盖掉其中的 getErrorRender(...) 方法,将其返回的 render 自己定制一下即可,非常容易

最后配置一下:
me.setRenderFactory(new MyRenderFactory());

上面这行代码假定你扩展出来的类是 MyRenderFactory extends RenderFactory

66666666

2019-08-30 11:21

@JFinal 多谢波总,我有点傻了,项目里我写过extends RenderFactory的,现在跑来这里询问,这脑子........虽然异曲同工,不过还是想提醒一下遇到此问题的道友,本项目是用jboot做的,版本为1.6.9,如果是要监听render(“”)的话,是要extends JbootRenderFactory,如果是extends RenderFactory 是没有什么页面效果的(我尝试过了,至于原因暂时没找出),代码如下:
public class RenderFactory extends JbootRenderFactory{
public Render getErrorRender(int errorCode) {
if (errorCode == 500) {
//return new JsonRender(json);
return super.getHtmlRender("找不到相应的模板文件,请联系管理员或登录后台系统修改相 关模板文件设置!");
}
return super.getErrorRender(errorCode);
}
}
最后配置:
public void onJfinalConstantConfig(Constants constants) {
constants.setDevMode(true);
//constants.setError500View("/webapp/views/common/error.html");
//constants.setError404View("/webapp/views/common/404.html");
constants.setRenderFactory(new RenderFactory());
//RenderManager.me().setRenderFactory(new RenderFactory());
}

JFinal

2019-08-30 11:23

@66666666 解决就好, jfinal 几乎所有地方都是可以扩展的,例如 ActionHandler 也可以扩展,这样甚至就接管了整个 jfinal

所有 render 通过 RenderFactory 也可以扩展定制

Db 类的行为也可以通过继承 DbPro 来扩展,极度灵活、强大

66666666

2019-08-30 11:47

@JFinal 我真心觉得jfinal不错,不止在性能方面以及上面提到的扩展方面,还有很多地方值得称赞,原码我都不止读过3次了,不过....有件事不知当不当讲。算了,非常感谢波总的耐心解答!

JFinal

2019-08-30 14:12

@66666666 啥事当讲不当讲,可以发私信给我

热门反馈

扫码入社