JFinal Freemarker 中如何获得session

lcccc 发布于 2012/07/02 10:35
阅读 12K+
收藏 10
jfinal 中 怎么我用freemarker 去sessin中的值老是抛
Expression session is undefined on line 38, column 92
取值的常用格式都试过 session["xxx"],session.xxx 直接xxx

加载中
1
JFinal
JFinal

    JFinal与Struts2不同,在使用Freemarker作为View的时候,没有自动将session传送至页面使用,原因很简单,为了遵循restful。如果在项目中使用了session,那么集群就不太方便了,需要想办法对session进行同步才可以。所以JFinal默认是不会去生成session对象让开发者去使用的。

    即便如此,开发者可以通过使用拦截器来轻松添中session到view中使用,JFinal新版本中已经提供了SessionInViewInterceptor来支持这种需求,代码在上面已经给出,总之JFinal不会自做主张的做无意义的事情 :)

1
l
lcccc

因为 jfinal 提倡 restful 的 不建议使用 session

如果要在页面获取session 需要自己设置 一个handler 将session 放入request中

public class SessionHandler extends Handler {
    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        request.setAttribute("session", request.getSession());
        nextHandler.handle(target, request, response, isHandled);
    }
}

 

1
l
lcccc
那如果jf不建议使用 session 那类似于登录 需要保存用户信息的用列 jf 有什么好的解决方案吗?
0
JFinal
JFinal

引用来自“lcccc”的答案

那如果jf不建议使用 session 那类似于登录 需要保存用户信息的用列 jf 有什么好的解决方案吗?
可以为每个用户在cookie中放入一个全球唯一的不容易被伪造的身份标识(类似于实现session的jsessionid值)。利用这个身份标识,可以有多种办法来解决问题了。例如,可以在数据库中存放用户登录信息,也可以使用一个集中的cache 来存放 :)
0
JFinal
JFinal

引用来自“lcccc”的答案

因为 jfinal 提倡 restful 的 不建议使用 session

如果要在页面获取session 需要自己设置 一个handler 将session 放入request中

public class SessionHandler extends Handler {
    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        request.setAttribute("session", request.getSession());
        nextHandler.handle(target, request, response, isHandled);
    }
}

 

    下一版的 JFinal将提供 SessionInViewInterceptor 来实现本功能,代码如下:

public class SessionInViewInterceptor implements Interceptor {
  public void intercept(ActionInvocation ai) {
    ai.invoke();
    
    HttpSession hs = ai.getController().getSession(false);
    if (hs != null) {
      Map session = new HashMap();
      ai.getController().setAttr("session", session);
      for (Enumeration<String> names=hs.getAttributeNames(); names.hasMoreElements();) {
        String name = names.nextElement();
        session.put(name, hs.getAttribute(name));
      }
    }
  }
}

 

0
27号
27号

我怎么取不出来??

Controller中

setSessionAttr("name", "value");

freemarker中

${session["name"]}

@jfinal @lcccc

 

 

0
JFinal
JFinal

引用来自“27号”的答案

我怎么取不出来??

Controller中

setSessionAttr("name", "value");

freemarker中

${session["name"]}

@jfinal @lcccc

 

 

JFinal 遵循 Restful,不提倡使用Session,所以默认情况下不对Sessoin进行干预,开发者需要使用的话可以为当前Action添加拦截器:SessionInViewInterceptor 
JFinal
JFinal
回复 @27号 : 还是不行的话,建议调试一下,在SessionInviewInterceptor 中设置一个断点,看看该代码是否被调用,值是否被正确设置 :)
JFinal
JFinal
回复 @27号 : session本质上也用的cookie
JFinal
JFinal
回复 @27号 : 不用 session 也可以判断用户权限,例如,有些项目用的cookie:生成一个当前用户的序列值放cookie用来标识用户身份,后端拿到这个值后,可能查库,也可以从一个中央缓存中得到这个用户
27号
27号
那用户权限如何判断?如何获取当前的用户?都在url传?
27号
27号
我加了这个,还是不行。
0
27号
27号

引用来自“JFinal”的答案

引用来自“27号”的答案

我怎么取不出来??

Controller中

setSessionAttr("name", "value");

freemarker中

${session["name"]}

@jfinal @lcccc

 

 

JFinal 遵循 Restful,不提倡使用Session,所以默认情况下不对Sessoin进行干预,开发者需要使用的话可以为当前Action添加拦截器:SessionInViewInterceptor 
明天早上调试一下。还是不行。
0
27号
27号
@jfinal ,我刚才调试跟踪了下代码,request的attr中已经存入了session对象,并且直到FreemarkerRender.render()方法template.process(root, writer);中的root中已经设置了session变量,但是在freemarker中使用${session["name"]}还是取不到,我打印出freemarker的调试信息如下:

DEBUG freemarker.beans [81] - Key 'name' was not found on instance of org.apache.catalina.session.StandardSessionFacade. 
Introspection information for the class is: {getValue=public java.lang.Object org.apache.catalina.session.StandardSessionFacade.getValue(java.lang.String), attributeNames=java.beans.PropertyDescriptor@796e2b64, servletContext=java.beans.PropertyDescriptor@8ac23a08, maxInactiveInterval=java.beans.PropertyDescriptor@5d530539, lastAccessedTime=java.beans.PropertyDescriptor@e65ae6b5, hashCode=public native int java.lang.Object.hashCode(), getAttributeNames=public java.util.Enumeration org.apache.catalina.session.StandardSessionFacade.getAttributeNames(), getAttribute=public java.lang.Object org.apache.catalina.session.StandardSessionFacade.getAttribute(java.lang.String), getValueNames=public java.lang.String[] org.apache.catalina.session.StandardSessionFacade.getValueNames(), getLastAccessedTime=public long org.apache.catalina.session.StandardSessionFacade.getLastAccessedTime(), id=java.beans.PropertyDescriptor@7a8942d0, creationTime=java.beans.PropertyDescriptor@5247794b, getId=public java.lang.String org.apache.catalina.session.StandardSessionFacade.getId(), getClass=public final native java.lang.Class java.lang.Object.getClass(), setMaxInactiveInterval=public void org.apache.catalina.session.StandardSessionFacade.setMaxInactiveInterval(int), valueNames=java.beans.PropertyDescriptor@4be32140, sessionContext=java.beans.PropertyDescriptor@6c3b1fbe, putValue=public void org.apache.catalina.session.StandardSessionFacade.putValue(java.lang.String,java.lang.Object), equals=public boolean java.lang.Object.equals(java.lang.Object), isNew=public boolean org.apache.catalina.session.StandardSessionFacade.isNew(), java.lang.Object@1eb0=freemarker.ext.beans.MethodMap@19a37a, class=java.beans.PropertyDescriptor@2c1c0868, getSessionContext=public javax.servlet.http.HttpSessionContext org.apache.catalina.session.StandardSessionFacade.getSessionContext(), setAttribute=public void org.apache.catalina.session.StandardSessionFacade.setAttribute(java.lang.String,java.lang.Object), invalidate=public void org.apache.catalina.session.StandardSessionFacade.invalidate(), getServletContext=public javax.servlet.ServletContext org.apache.catalina.session.StandardSessionFacade.getServletContext(), getCreationTime=public long org.apache.catalina.session.StandardSessionFacade.getCreationTime(), new=java.beans.PropertyDescriptor@b13670d1, removeValue=public void org.apache.catalina.session.StandardSessionFacade.removeValue(java.lang.String), getMaxInactiveInterval=public int org.apache.catalina.session.StandardSessionFacade.getMaxInactiveInterval(), java.lang.Object@458f41={public boolean java.lang.Object.equals(java.lang.Object)=[Ljava.lang.Class;@1381960, public void org.apache.catalina.session.StandardSessionFacade.removeValue(java.lang.String)=[Ljava.lang.Class;@9fa8f, public long org.apache.catalina.session.StandardSessionFacade.getLastAccessedTime()=[Ljava.lang.Class;@120dbf3, public long org.apache.catalina.session.StandardSessionFacade.getCreationTime()=[Ljava.lang.Class;@4845aa, public int org.apache.catalina.session.StandardSessionFacade.getMaxInactiveInterval()=[Ljava.lang.Class;@d5c0f9, public final native java.lang.Class java.lang.Object.getClass()=[Ljava.lang.Class;@1701bdc, public void org.apache.catalina.session.StandardSessionFacade.removeAttribute(java.lang.String)=[Ljava.lang.Class;@1353249, public native int java.lang.Object.hashCode()=[Ljava.lang.Class;@1786286, public java.lang.String org.apache.catalina.session.StandardSessionFacade.getId()=[Ljava.lang.Class;@8c5ea2, public java.lang.Object org.apache.catalina.session.StandardSessionFacade.getValue(java.lang.String)=[Ljava.lang.Class;@198defc, public void org.apache.catalina.session.StandardSessionFacade.setMaxInactiveInterval(int)=[Ljava.lang.Class;@1579a30, public boolean org.apache.catalina.session.StandardSessionFacade.isNew()=[Ljava.lang.Class;@4bfe6b, public void org.apache.catalina.session.StandardSessionFacade.putValue(java.lang.String,java.lang.Object)=[Ljava.lang.Class;@12c5431, public javax.servlet.http.HttpSessionContext org.apache.catalina.session.StandardSessionFacade.getSessionContext()=[Ljava.lang.Class;@14b6bed, public java.lang.Object org.apache.catalina.session.StandardSessionFacade.getAttribute(java.lang.String)=[Ljava.lang.Class;@9aba32, public void org.apache.catalina.session.StandardSessionFacade.invalidate()=[Ljava.lang.Class;@366573, public java.lang.String[] org.apache.catalina.session.StandardSessionFacade.getValueNames()=[Ljava.lang.Class;@13e75a5, public javax.servlet.ServletContext org.apache.catalina.session.StandardSessionFacade.getServletContext()=[Ljava.lang.Class;@19da967, public java.lang.String java.lang.Object.toString()=[Ljava.lang.Class;@1dcc2a3, public void org.apache.catalina.session.StandardSessionFacade.setAttribute(java.lang.String,java.lang.Object)=[Ljava.lang.Class;@6e8f94, public java.util.Enumeration org.apache.catalina.session.StandardSessionFacade.getAttributeNames()=[Ljava.lang.Class;@943dc4}, removeAttribute=public void org.apache.catalina.session.StandardSessionFacade.removeAttribute(java.lang.String), toString=public java.lang.String java.lang.Object.toString()}

0
27号
27号
呼呼,终于弄好了!看了下freemarker的部分代码才弄明白,稍后单独开贴说明。
27号
27号
回复 @林庆豪 : 用最新版的jfinal,并且看这个帖子(http://www.oschina.net/question/917732_102225),你就会用了。
林庆豪
林庆豪
怎么做的?
返回顶部
顶部