在学习你的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就不会出现这个错误
项目:jboot
在Jboot中,关于FlashMessage的设置,是render() 之前,之后如果不是跳转,就会清除之前可能设置的 FlashMessage