Jfinal+freemark框架,session无法取值的问题

发布时间:2018-03-15作者:laosun阅读(3367)

Jfinal+freemark框架,session无法取值的问题

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)


0 +1

版权声明

 前端  源码  freemark

 请文明留言

1 条评论