Java客戶端通過HttpURLConnection連線Web伺服器的Session儲存問題
通過Java客戶端訪問Web時,session資訊的儲存問題。
通過瀏覽器訪問Web,瀏覽器自動管理Http連線的的session資訊,如果通過Java連線,比如HttpURLConnection,就需要程式自己管理session。
我們希望java客戶端能像瀏覽器一樣,每次請求都維持一個session。
具體做法時這樣:
客戶端程式碼:
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
publicclass Client {
public static void main(String[] args) throws IOException {
URL url = new URL("http://localhost:8080/lbs_server/print_session.jsp");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setDoOutput(true);
//第二次執行的時候,把上次讀取的session的值設定上
conn.setRequestProperty(
PrintWriter out = new PrintWriter(conn.getOutputStream());
String str = "url = " + url;
System.out.println("");
out.println(str);
out.flush();
BufferedReader in = null;
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String destStr = ""
String inputLin = "";
while((inputLin = in.readLine()) != null ){
destStr += inputLin;
}
System.out.println(destStr);
//第一次執行的時候,記錄下來session的值
String session_value = conn.getHeaderField("Set-Cookie");
String[] sessionId = session_value.split(";");
System.out.println(sessionId[0]);
System.out.println("Session Value = " + session_value);
}
}
由於只是測試程式碼,只是示例一下。
第一次連線的時候獲取session資訊,取出sessionId[0]。再次連線的時候,將session資訊設定為sessionId[0],就可以了。
再伺服器端的程式碼時這樣:
print_session.jsp
<body>
<% System.out.println(session.getId());
if(session.getAttribute("first_time") == null )
session.setAttribute("first_time",System.currentTimeMillis());
System.out.println("first_time:" + (Long)(session.getAttribute("first_time")) );
%>
</body>
這樣再伺服器端看到的session資訊和session資料都在。
比如兩次連線伺服器端得到的結果都是:
320C57C083E7F678ED14B8974732225E
first_time:1311899387880
320C57C083E7F678ED14B8974732225E
first_time:1311899387880