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

JSP 與 ASP.NET 跨平台共享 Session 方案:資料庫中轉法

     編輯:關於JSP

背景與挑戰

企業常有舊系統(JSP)與新系統(ASP.NET)並存,需實現單點登入(SSO)。直接序列化 Session 物件跨語言反序列化極其困難(物件結構、類加載器、序列化格式不兼容)。本文採用「資料庫中轉 Session 關鍵值」的替代方案。

架構設計

  1. 用戶在 ASP.NET 端登入成功。
  2. ASP.NET 將關鍵 Session 值(UserID、權限等)連同 ASP.NET SessionID 寫入共享資料庫表 iis_session。
  3. ASP.NET 重定向至 JSP 頁面,攜帶 aspnetsessionid 參數。
  4. JSP 端根據該 ID 從資料庫讀取用戶信息,建立自身 Session。
  5. 雙邊登出時同步刪除資料庫記錄。

資料庫表結構

CREATE TABLE iis_session (
    id VARCHAR(26) PRIMARY KEY,  -- ASP.NET SessionID
    userid INT,                  -- 用戶編號
    power INT                    -- 權限編碼
);

ASP.NET 關鍵代碼

登入後寫入 Session

private void WriteSession2DB(string sessionID, string sUID, string sPWR) {
    string sql = "INSERT INTO iis_session (id, userid, power) VALUES (@sid, @uid, @pwr)";
    using (SqlCommand cmd = new SqlCommand(sql, conn)) {
        cmd.Parameters.AddWithValue("@sid", sessionID);
        cmd.Parameters.AddWithValue("@uid", Convert.ToInt32(sUID));
        cmd.Parameters.AddWithValue("@pwr", Convert.ToInt32(sPWR));
        cmd.ExecuteNonQuery();
    }
}

登出時清理

private void RemoveSession4DB() {
    string sql = "DELETE FROM iis_session WHERE id = @sid";
    using (SqlCommand cmd = new SqlCommand(sql, conn)) {
        cmd.Parameters.AddWithValue("@sid", Session.SessionID);
        cmd.ExecuteNonQuery();
    }
}

重定向至 JSP

private void Page_Load(object sender, EventArgs e) {
    string url = "https://localhost/test.jsp?aspnetsessionid=" + Session.SessionID;
    Response.Redirect(url, true);
}

JSP 端讀取與建立 Session

<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="db" scope="page" class="com.itbaby.bean.dbx.database"/>
<%
    String aspNetSid = request.getParameter("aspnetsessionid");
    db.dbConnOpen("itbaby_dbpool");
    String sql = "SELECT userid, power FROM iis_session WHERE id = '" + aspNetSid + "'";
    ResultSet rs = db.getRs(sql);
    if (rs.next()) {
        String uid = rs.getString(1);
        String power = rs.getString(2);
        session.setAttribute("userId", uid);
        session.setAttribute("power", power);
        // 可選:輸出驗證信息
        out.println("ASP.Net Session Value UserID = " + uid);
        out.println("ASP.Net Session Value Power = " + power);
    }
    rs.close();
    db.dbConnClose();
%>

安全考量

  • 使用參數化查詢防止 SQL 注入(JSP 端同樣需用 PreparedStatement)。
  • aspnetsessionid 僅作為一次性憑證,JSP 讀取後應立即建立自身 Session,不再依賴該參數。
  • 資料庫表需定期清理過期記錄(配合 ASP.NET Session 過期事件或定時任務)。
  • 生產環境必須使用 HTTPS 傳輸參數,防止會話劫持。

優缺點總結

優點缺點
實現簡單,跨語言無序列化難題僅共享關鍵值,非完整 Session 物件
不暴露用戶敏感 ID(如 UserID)於 URL依賴資料庫可用性,引入單點故障
雙向登出易於同步Session 過期時間需雙端一致維護

進階方案展望

若需共享完整 Session 狀態,可引入集中式 Session 存儲(Redis/Memcached),雙端統一讀寫序列化後的 Map/JSON,配合統一 SessionID 生成策略(如 UUID),實現真正的跨語言 Session 共享。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved