首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JFinal + FreeMarker 獲取 Session 值解決方案:攔截器注入內置對象

     編輯:Java 相關知識

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();
    }
}

使用方式

1. Controller 掛載攔截器

@Before(PublicInterceptor.class)
@ControllerBind(controllerKey = "PersonalCenter", viewPath = "/")
public class PersonalCenterController extends BaseController {
    public void personal() {
        // 業務邏輯...
        setSessionAttr("PERSONALCENTER", userData);
        render("personal.html");
    }
}

2. FreeMarker 模板中讀取

<#if session['PERSONALCENTER']??>
    ${session['PERSONALCENTER'].username}
</#if>

JFinal 內置替代方案

新版 JFinal 提供 SessionInViewInterceptor 開箱即用,配置方式相同:

@Before(SessionInViewInterceptor.class)
public class MyController extends Controller { ... }

最佳實踐建議

  • 優先考慮無狀態設計(JWT Token),避免 Session 集群同步問題
  • 若必須用 Session,配合 Redis 實現分布式 Session 共享
  • 攔截器粒度控制:僅在需要 Session 的 Controller 掛載,減少無關請求開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved