透過 Java 客戶端實驗對比 HttpURLConnection 與 HttpClient 的 Session 管理差異,揭示「伺服器端 Session ID + 客戶端 Cookie 攜帶」的核心機制,並說明 PHP 端登入驗證流程。
<?php
session_start();
if (isset($_POST['username'])) {
$username = $_POST['username'];
$password = $_POST['password'];
if ($username == 'admin' && $password == 'admin') {
$_SESSION['username'] = $username;
echo "<a href='content.php'>進入網站</a>";
} else {
echo "-1";
}
}
?>
<form method="post">
<input name="username"> <input type="password" name="password">
<input type="submit" value="submit">
</form>
<?php
session_start();
if (isset($_SESSION['username'])) {
echo "login ok";
} else {
echo "not login";
}
?>
public class NetHelper {
private String sessionId = "";
public String request(String url) throws IOException {
HttpURLConnection huc = (HttpURLConnection) new URL(url).openConnection();
huc.addRequestProperty("Cookie", sessionId); // 手動攜帶 Session ID
// ... 讀取回應 ...
}
public String login(String url) throws IOException {
HttpURLConnection huc = (HttpURLConnection) new URL(url).openConnection();
huc.setRequestMethod("POST");
// ... 寫入 POST 參數 ...
huc.connect();
// 從回應標頭提取 Set-Cookie
String[] parts = huc.getHeaderField("Set-Cookie").split(";");
this.sessionId = parts[0]; // 儲存 JSESSIONID / PHPSESSID
// ... 讀取回應 ...
}
}
public class NetClient {
private HttpClient client = new DefaultHttpClient(); // 內含 CookieStore
public String request(String url) { /* 直接發送,自動攜帶 Cookie */ }
public String login(String url) { /* 登入後 CookieStore 自動保存 Session ID */ }
}
| 特性 | HttpURLConnection | HttpClient |
|---|---|---|
| Session 管理 | 手動(開發者負責) | 自動(內建 CookieStore) |
| Cookie 處理 | 需解析 Set-Cookie、手動加請求頭 | 透明化,無感知 |
| 適用場景 | 簡單請求、不想引入依賴 | 複雜流程、需維持會話狀態 |
| 並發限制 | 無內建限制 | 同一 Client 實例串列執行 |
PHPSESSID)session.cookie_httponly=1、session.use_strict_mode=1、定期 session_regenerate_id()