JFinal 為遵循 RESTful 原則,默認不將 Session 傳遞給 FreeMarker 視圖。直接使用 session["xxx"]、session.xxx 均無法取值。本文提供基於攔截器的通用解決方案。
JFinal 設計理念:Session 會導致集群同步困難,默認不生成 Session 對象供視圖使用。若業務必須使用 Session,需手動注入。
public class PublicInterceptor implements Interceptor {
@Override
public void intercept(Invocation inv) {
Controller c = inv.getController();
// 注入 JSP 內置對象
c.setAttr("request", c.getRequest());
c.setAttr("response", c.getResponse());
// 關鍵:包裝 Session 為 FreeMarker 可用的 HashModel
c.setAttr("session", new HttpSessionHashModel(
c.getSession(),
FreeMarkerRender.getConfiguration().getObjectWrapper()
));
inv.invoke();
}
}
@Before(PublicInterceptor.class)
@ControllerBind(controllerKey = "PersonalCenter", viewPath = "/")
public class PersonalCenterController extends BaseController {
public void personal() {
// 業務邏輯...
setSessionAttr("PERSONALCENTER", userData);
render("personal.html");
}
}
<#if session['PERSONALCENTER']??>
${session['PERSONALCENTER'].username}
</#if>
新版 JFinal 提供 SessionInViewInterceptor 開箱即用,配置方式相同:
@Before(SessionInViewInterceptor.class)
public class MyController extends Controller { ... }