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

发布于 2021-11-29 07:39:02 字数 1073 浏览 932 评论 4

开发环境: 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

苍暮颜 2021-11-30 13:56:48

正解

柳若烟 2021-11-30 13:56:27

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

controller.renderText("timeout");

多彩岁月 2021-11-30 13:55:59

今天也遇到这个问题了,在render应用的最后加了一个renderNull()就好了

因为看清所以看轻 2021-11-30 13:06:39

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文