2
回答
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页面.

举报
共有2个答案 最后回答: 3年前

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

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

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

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

controller.renderText("timeout");


--- 共有 1 条评论 ---
糊搞正解 3年前 回复
顶部