通过Java客户端访问Web时,session信息的保存问题。
通过浏览器访问Web,浏览器自动管理Http连接的的session信息,如果通过Java连接,比如HttpURLConnection,就需要程序自己管理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;
public class Client {
public static void main(String[] args) throws IOException {
URL url = new URL( "http://localhost:8080/lbs_server/print_session.jsp");Java中自定义链表总结
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET" );
conn.setDoOutput(true );
//第二次运行的时候,把上次读取的session的值设置上
conn.setRequestProperty( "Cookie", "JSESSIONID=320C57C083E7F678ED14B8974732225E");
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
My demo
package com.rui.utils;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import com.rui.logo.Logoo;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
URL url = null;
HttpURLConnection conn = null;
try {
url = new URL("http://127.0.0.1:8080/weizhi/index.jsp");
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(200000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("GET");
// 设置SESSION 第二次
conn.setRequestProperty("Cookie",
"JSESSIONID=67B7B5265D13BBA3D8D212BB4E4C8252");
// 获取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);
InputStream inputStream = conn.getInputStream();
String responseXML = changeInputStream(inputStream, "GB2312");
// System.out.println(responseXML);
} catch (MalformedURLException ue) {
Logoo.debug(ue.getMessage());
} catch (Exception ioe) {
Logoo.debug(ioe.getMessage());
} finally {
}
}
private static String forTest(String file) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(file));
String s, s2 = new String();
while ((s = in.readLine()) != null)
s2 += s + "\n";
in.close();
return s2;
}
private static String changeInputStream(InputStream inputStream,
String encode) {
// TODO Auto-generated method stub
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
String result = "";
if (inputStream != null) {
try {
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, len);
}
result = new String(outputStream.toByteArray(), encode);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
}