JFinal 全局拦截器错误: Cannot forward after response has been committed
开发环境: JFinal + beetl
全局拦截器拦截用户的session是否过时,或者用户是否登录,如果session过时或未登录,则跳转到登陆页面,
我在删除数据前,把session清空了,删除会跳到登陆页面,但是却有错误log
Cannot forward after response has been committed
拦截器写法:
if (!controller.getResponse().isCommitted()) {
controller.renderNull();
wirter = controller.getResponse().getWriter();
wirter.write("timeout");
wirter.flush();
}
我需要接收到timeout字符串,以用来判断是否是session过时.请教一下@JFinal ,为什么会报错,你在有个帖子说是用 ai.controller.renderNull();但是我这个不行,我需要返回"timeout"字串用来跳转login页面.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
正解
使用controller.renderXXX();就已经足够,后面都是多余的。还会造成多次使用response的错误,正确的做法是下面
controller.renderText("timeout");
今天也遇到这个问题了,在render应用的最后加了一个renderNull()就好了
要传一个 timeout 数据过去,如果是直接页面渲染,直接 inv.getController().setAttr("timeout", value); 即中不必这么麻烦。如果是 redirect 重定向,用一个问号挂参 redirect(url?timeout=value。 如果是响应 ajax 请求,则 inv.getController().renderJson("timeout", value);
最后,造成异常的原因是:你的某个 render 调用,会执行一次 writer.close() 关闭了与客户端的连接,然而你在此后又再次对 response.getWriter() 进行操作,此时已经关闭连接了,所以必会出错。当然,第一个 close() 造成的原因也可能是你自己的代码 close() 掉的,原理上一样。