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

Java 模擬登錄校內網:Cookie 與 Session 判斷登錄狀態正確姿勢

     編輯:程式設計疑難解答

場景

模擬登錄學校 Struts2 系統(`.action` 後綴),登錄前後 URL 相同,無法靠頁面跳轉判斷。嘗試用 `JSESSIONID` Cookie 判斷,但發現請求與響應的 `JSESSIONID` 相同,無法區分。

誤區分析

  • JSESSIONID ≠ 登錄憑證:它是會話標識,瀏覽器首次訪問即獲取,登錄前後通常不變(除非服務端換發)。
  • 登錄狀態存儲在 Session 中:服務端 `session.setAttribute("user", userObj)`,而非 Cookie 值本身。

正確判斷流程

  1. 獲取登錄頁 Cookie:首次 GET 登錄頁,保存 `Set-Cookie` 中的 `JSESSIONID`。
  2. POST 登錄表單:攜帶該 Cookie、表單數據(含驗證碼)、正確 Headers(User-Agent, Referer 等)。
  3. 檢查響應:
    • 響應 Headers 中 `Set-Cookie` 是否有新 `JSESSIONID`(部分系統登錄成功換發)。
    • 響應 Body/重定向頁面是否包含「歡迎、退出、個人中心」等登錄特徵關鍵字。
    • 攜帶 Cookie 請求一個需登錄的頁面(如個人信息頁),解析 HTML 確認用戶信息顯示。
  4. 後續請求:攜帶登錄後獲取的所有 Cookie(合併新舊)訪問受保護資源。

代碼關鍵點 (HttpClient 4.x 示例)

CloseableHttpClient client = HttpClients.custom()
    .setDefaultCookieStore(new BasicCookieStore())
    .build();

// 1. 獲取初始 Cookie
HttpGet getLogin = new HttpGet(loginUrl);
client.execute(getLogin, response -> { /* 自動存 Cookie */ });

// 2. 提交登錄
HttpPost postLogin = new HttpPost(loginUrl);
postLogin.setEntity(new UrlEncodedFormEntity(params, Consts.UTF_8));
postLogin.setHeader("User-Agent", "Mozilla/5.0...");
postLogin.setHeader("Referer", loginUrl);
CloseableHttpResponse resp = client.execute(postLogin);

// 3. 判斷登錄成功
String html = EntityUtils.toString(resp.getEntity());
boolean success = html.contains("歡迎您") || html.contains("退出登錄");
// 或檢查重定向 Location Header

// 4. 後續使用同一 client(自動攜帶 Cookie)
HttpGet getInfo = new HttpGet(infoUrl);
client.execute(getInfo, ...);

Struts2 登錄機制補充

Struts2 將用戶對象存入 `SessionMap`(`session.setAttribute("user", user)`)。攔截器檢查 Session 中是否有 `user` 對象決定是否放行。模擬登錄只需維持會話 Cookie,服務端自動關聯 Session。

總結

不要盯著 `JSESSIONID` 變不變。登錄成功標誌是:服務端 Session 中寫入了用戶標識,客戶端憑 Cookie 訪問受保護資源返回授權內容。驗證方式:登錄後請求一個需要權限的接口/頁面,解析內容確認。

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