请教@海哥,JbootActionHandler中关于FlashAttrs部分的实现

在学习你的JBoot关于FlashMessage的实现

if (render instanceof RedirectRender && controller instanceof JbootController) {
    HashMap flash = ((JbootController) controller).getFlashAttrs();
    if (flash != null) {
        controller.setSessionAttr(FLASH_SESSION_ATTR, flash);
    }
} else {
    controller.removeSessionAttr(FLASH_SESSION_ATTR);
}


这段是将FlashMessage暂存到session的代码

我也是按照你的思路实现的,但调试时报错:

java.lang.IllegalStateException: Response is committed
    at org.eclipse.jetty.server.Request.getSession(Request.java:1550) ~[jetty-server-9.4.8.v20171121.jar:9.4.8.v20171121]
    at com.jfinal.core.Controller.setSessionAttr(Controller.java:463) ~[jfinal-java8-3.3.jar:na]


然后,我在render.setContext这句前后查看response的状态:

System.out.println(response.isCommitted());

render.setContext(request, response, action.getViewPath()).render();

System.out.println(response.isCommitted());

显示:

false
true


应该是response.sendRedirect(...)相当于进行了flush操作

所以,在render()之后,response确实是Committed的,所以才被下面的catch给抓到

不知道 @海哥 是怎么处理的,JBoot就不会出现这个错误

评论区

海哥

2018-03-11 15:05

response 的使用,不能再render()之后,因为render()后会关闭链接了。

在Jboot中,关于FlashMessage的设置,是render() 之前,之后如果不是跳转,就会清除之前可能设置的 FlashMessage

JFinal

2018-03-11 17:06

@海哥 jfinal 新版本 TemplateRender 不再关闭从 response 获取到的流,将关闭操作留给 jetty tomcat 之类的,也方便了用户多次从 response 中获取流来操作

netwild

2018-03-11 17:55

@海哥
好吧,我看的是jboot2个月之前的版本,现在的版本确实是放在render()之前了
话说你的源码看起来真是舒服

netwild

2018-03-11 17:57

@JFinal 3.3算新版本吗?

JFinal

2018-03-11 18:17

@netwild 3.4 是最新的版本,但还没有发布。 3.3 已经不关闭 response 流了,如果你是因为这个小功能,那么用 jfinal 3.3 就行

如果要使用 jfinal 3.4 可以用一下这个分享中的办法:
http://www.jfinal.com/share/714

netwild

2018-03-11 22:00

@JFinal 我说的这个功能跟render()关闭response流没关系,因为用的是redirect。参考的Jboot源码还不是最新的,才出现这个问题。
估计海哥也是发现这个问题才进行了优化。

海哥

2018-03-12 10:56

@JFinal 3.4啥时候发布呀,期待....

热门反馈

扫码入社