发布时间:2018-03-15作者:laosun阅读(3143)
jfinal后台放入的session对象值,在freemark前端无法获取,直接报错,我找出了解决办法,现在贴出来分享给大家
jfinal后台登录成功,或者放入的一些session数据,比如:getSession().setAttribute("user", user);
那么前端freemark获取值应该是:${Session['user']} 即可,但是会提示错误信息。
解决办法是:创建一个 Interceptor,重新放一遍 new HttpSessionHashModel(hs, ObjectWrapper.DEFAULT_WRAPPER)
例如:我创建的一个Interceptor拦截器
/** * freemark框架session拦截器、过滤器 * * @author sun */ public class FreemarkerSessionInViewInterceptor implements Interceptor { @Override public void intercept(Invocation ai) { // 去除没有继承AppController的类 if ((ai.getController() instanceof BaseController)) { Controller c = ai.getController(); HttpSession hs = c.getSession(false); if (hs != null) { c.setAttr("Session", new HttpSessionHashModel(hs, ObjectWrapper.DEFAULT_WRAPPER)); } ai.invoke(); }else{ ai.invoke(); return ; } } }
然后再jfinal的config启动配置里边加入即可
public void configInterceptor(Interceptors me) { me.add(new FreemarkerSessionInViewInterceptor()); }
那么在前端获取的时候必须要判断Session是否为空:
<#if Session?? && Session['blog_user']?exists>
不过最近呢,我发现jfinal最新版本提供这种拦截器
JFinal与Struts2不同,在使用Freemarker作为View的时候,没有自动将session传送至页面使用,原因很简单,为了遵循restful。如果在项目中使用了session,那么集群就不太方便了,需要想办法对session进行同步才可以。所以JFinal默认是不会去 生成session对象让开发者去使用的。
即便如此,开发者可以通过使用拦截器来轻松添中session到view中使用,JFinal新版本中已经提供了SessionInViewInterceptor来支持这种需求。
在登录或注册的Controller类前加代码@Before(SessionInViewInterceptor.class)调用即可。
取值方式:${session['userInfo'].username} (具体取值方式还请看源码 SessionInViewInterceptor.java)
版权属于: 技术客
原文地址: https://www.sunjs.com/article/detail/42ffaaee8f9e40d3b10cb5f9033bcdde.html
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。