enjoy session取值问题

@JFinal  我已做了如下配置,为什么还是报错?

[ERROR]-[Thread: http-8080-4]-[com.jfinal.core.ActionHandler.handle()]: /login

com.jfinal.render.RenderException: com.jfinal.template.TemplateException: "session" can not be null for accessed by "session.user"

Template: "/common/header.html". Line: 4


/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		me.add(new com.demo.Interceptor.LoginInterceptor());
		me.add(new SessionInViewInterceptor());
	}

html:

当前用户:<span><a>#(session.user.name)(#(session.user.usrId))</a></span>

评论区

溪碧旗

2018-09-26 19:29

建议把SessionInViewInterceptor放第一行,否则你在LoginInterceptor里应该是拿不到session内容的

fox

2018-09-27 20:35

@Jfinal , @溪碧旗 放在前面还是不行,什么原因? 我的LoginInterceptor及login方法如下,1.8版本下都是能正常运行的:
public class LoginInterceptor implements Interceptor {

public void intercept(ActionInvocation ai) {
Controller controller=ai.getController();
UserVO userVO=controller.getSessionAttr("user");
if (userVO==null){
controller.redirect("/login.jsp");
}else {
ai.invoke();
}
}
}


public void login(){
System.out.println("login controller");
String name=getPara("user","");
String pwd=getPara("pwd","");

UserView user= UserView.dao.findFirst("select * from v_rs_employee where jobno =? and webpwd=?", name,pwd);
if (user!=null){
UserVO userVO=new UserVO();
userVO.setName(user.getStr("cname"));
userVO.setUsrId(user.getStr("jobno"));
setSessionAttr("user", userVO);
redirect("index.html");
}else{
setAttr("msg", "用户名或密码错误!");
renderHtml("/login.html");
}
}

JFinal

2018-09-28 00:28

@fox 为了提升性能,jfinal 默认并不会创建 session 对象,除非你的项目中明确用到了 session,例如用到了类似于下面的方法:
setSession(...);
getSession(true);
getRequest().getSession(true);

否则,需要为 SessionInViewInterceptor 拦截器指定一个默认创建 session 的参数:
me.add(new SessionInViewInterceptor(true));

不添加这个参数也可以,但在 enjoy 中的使用需要改成下面:
#(session.user.userId ??)

也就是说添加一个双问号操作符,这个操作符的具体作用看一下文档

JFinal

2018-09-28 00:29

@fox 上面回复的重点强调一下,在添加全局拦截器的时候为 SessionInViewInterceptor 构造方法添加一个 true 参数:
me.add(new SessionInViewInterceptor(true));

fox

2018-09-28 16:09

@JFinal 加了true还是一样呀, 配置放在前面也不行,
public void configInterceptor(Interceptors me) {
me.add(new SessionInViewInterceptor(true));
me.add(new com.demo.Interceptor.LoginInterceptor());
}

[com.jfinal.core.ActionHandler.handle()]: /login
com.jfinal.render.RenderException: com.jfinal.template.TemplateException: "session" can not be null for accessed by "session.user"
Template: "/common/index.html". Line: 16
at com.jfinal.render.TemplateRender.render(TemplateRender.java:62)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:108)
at com.demo.common.MyContextPathHandler.handle(MyContextPathHandler.java:31)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:73)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: com.jfinal.template.TemplateException: "session" can not be null for accessed by "session.user"

JFinal

2018-09-28 16:25

@fox 你先用 #(session ?? "session 为null") 输出一下,看一看 session 是不是为 null,这样就能确定 user 不存在了

如果 session 本身为 null,估计是你的自动编译没有打开,代码改了没生效而已

fox

2018-09-28 16:33

@JFinal 按以上输出测试, session 为null ,难道me.add(new SessionInViewInterceptor(true));没起作用?

setSessionAttr("user", userVO);
那改成模板后, 以上这句也就是说没有生效??没有session, setSessionAttr也就失败了,那为什么程序运行setSessionAttr("user", userVO);没有报错?

fox

2018-09-28 16:33

@JFinal 不知以上理解对否?

JFinal

2018-09-28 18:09

@fox setSessionAttr("user", userVO); 是一定生效了的,这个时候你的 session 还是 null 值,只有两种可能:
1:修改没有生效,例如自动编译没打开,现在启动用的代码本质还是以前的老代码
2:你的客户端不支持 cookie,因为 session 是依赖于浏览器的 cookie 的

fox

2018-09-28 18:12

@Jfinal
我作了如下测试, 在login Controller中:

setSessionAttr("user", userVO); //登陆成功后设置
System.out.println(getSessionAttr("user")); // 有值输出,现在我想问的是在模板中如何获取这个user值?急呀,项目升级就卡在这里了
System.out.println(getSession().getAttribute("session")); //无值

JFinal

2018-09-28 18:17

@fox 不要着急,这个是一定可以的,这个用了很多年的拦截器了,你是不是在这个 action 中使用 @Clear 做了拦截器清除?

fox

2018-09-28 20:04

@JFinal 是的,做了一个action级的@clear拦截器清除, 不然login总是被拦截在外,登陆不进去呀。

fox

2018-09-28 20:07

@JFinal 密码输入正确后又能登陆,同时又不能clear这个 login action 应如何实现呢?

fox

2018-09-28 20:17

@JFinal 解决了, @Clear一下Login拦截器即可, 以前@clear清除所有了,后续准备全部用上enjoy,慢慢深入,再有问题向您请教,谢谢。

fox

2018-09-28 20:19

补充一句,官网的搜索功能什么时候能上,免得相同的问题大家重复发帖,

热门反馈

扫码入社