Java客户端通过HttpURLConnection连接Web服务器的Session保存问题

本文介绍如何使用Java客户端代码管理HTTP Session,通过设置和获取Cookie中的JSESSIONID来模拟浏览器行为,实现跨请求维持同一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;

 

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;
	}
}



 

package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.Map; public class HttpTest { private HttpURLConnection hc = null; private static final String oneUrlString = "http://xxx.jsp"; private static final String twoUrlString = "http://xxx.action"; public String getSessionId() { String sessionId = ""; try { URL url = new URL(oneUrlString); hc = (HttpURLConnection) url.openConnection();//默认的用GET提交 hc.setDoOutput(true); hc.connect(); Map map = hc.getHeaderFields(); //得到Cookie的所有内容,包括SESSIONID,在进行下次提交的时候 直接把这个Cookie的值设到头里头就行了 //淡然只得到SESSIONID也很简单的 ,但是有时候Set-Cookie的值有几个的 List list = (List) map.get("Set-Cookie"); if(list.size() == 0||list == null) { return null; } StringBuilder builder = new StringBuilder(); for(String str : list) { sessionId = builder.append(str).toString(); } hc.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sessionId; } public String getResponseContext(String parameters) { String responseContext = ""; try { URL url = new URL(twoUrlString); hc = (HttpURLConnection) url.openConnection();//使用POST提交 hc.addRequestProperty("Cookie", getSessionId()); hc.setDoOutput(true); hc.connect(); OutputStream out = hc.getOutputStream(); //参数是a=""&b=""这样拼接的一个串 out.flush(); out.close(); out.write(parameters.getBytes(),0,parameters.getBytes().length); InputStream in = hc.getInputStream(); InputStreamReader reader = new InputStreamReader(in,"gb2312"); BufferedReader read = new BufferedReader(reader); StringBuilder builder = new StringBuilder(); String str = ""; while((str = read.readLine()) != null) { builder = builder.append(str); } read.close(); reader.close(); in.close(); hc.disconnect(); responseContext = builder.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return responseContext; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值