JFinal 全局拦截器错误: Cannot forward after response has been committed

狗修金萨玛 发布于 2015/11/02 13:37
阅读 1K+
收藏 0

开发环境: 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页面.

加载中
1
JFinal
JFinal

    要传一个 timeout 数据过去,如果是直接页面渲染,直接 inv.getController().setAttr("timeout", value); 即中不必这么麻烦。如果是 redirect 重定向,用一个问号挂参 redirect(url?timeout=value。 如果是响应 ajax 请求,则 inv.getController().renderJson("timeout", value); 

    最后,造成异常的原因是:你的某个 render 调用,会执行一次 writer.close() 关闭了与客户端的连接,然而你在此后又再次对 response.getWriter() 进行操作,此时已经关闭连接了,所以必会出错。当然,第一个 close() 造成的原因也可能是你自己的代码 close() 掉的,原理上一样。

寂寞不痛
寂寞不痛
今天也遇到这个问题了,在render应用的最后加了一个renderNull()就好了
狗修金萨玛
狗修金萨玛
只能说波总还是牛逼,各种情况都考虑了,我的是返回jason,多谢波总
1
littleant
littleant

使用controller.renderXXX();就已经足够,后面都是多余的。还会造成多次使用response的错误,正确的做法是下面

controller.renderText("timeout");


糊搞
正解
返回顶部
顶部