`
sb33060418
  • 浏览: 151618 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HttpClient4.x 使用cookie保持会话

    博客分类:
  • java
阅读更多
HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分)。

如果需要使用HttpClient池,并且想要做到一次登录的会话供多个HttpClient连接使用,就需要自己保存会话信息。因为客户端的会话信息是保存在cookie中的(JSESSIONID),所以只需要将登录成功返回的cookie复制到各个HttpClient使用即可。

使用Cookie的方法有两种,可以自己使用CookieStore来保存(见TestCookieStore()方法),也可以通过HttpClientContext上下文来维持(见TestContext()方法)。

附带HttpClient4.3示例代码 http://www.myexception.cn/program/1459749.html

package com.sunbin.httpSession;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.HeaderIterator;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.cookie.CookieSpecProvider;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.impl.cookie.BestMatchSpecFactory;
import org.apache.http.impl.cookie.BrowserCompatSpecFactory;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.junit.Test;

public class TestHttpClient {

	// 创建CookieStore实例
	static CookieStore cookieStore = null;
	static HttpClientContext context = null;
	String loginUrl = "http://127.0.0.1:8080/CwlProClient/j_spring_security_check";
	String testUrl = "http://127.0.0.1:8080/CwlProClient/account/querySubAccount.action";
	String loginErrorUrl = "http://127.0.0.1:8080/CwlProClient/login/login.jsp";

	@Test
	public void testLogin() throws Exception {
		System.out.println("----testLogin");

		// // 创建HttpClientBuilder
		// HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		// // HttpClient
		// CloseableHttpClient client = httpClientBuilder.build();
		// 直接创建client
		CloseableHttpClient client = HttpClients.createDefault();

		HttpPost httpPost = new HttpPost(loginUrl);
		Map parameterMap = new HashMap();
		parameterMap.put("j_username", "sunb012");
		parameterMap.put("j_password", "sunb012");
		UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity(
				getParam(parameterMap), "UTF-8");
		httpPost.setEntity(postEntity);
		System.out.println("request line:" + httpPost.getRequestLine());
		try {
			// 执行post请求
			HttpResponse httpResponse = client.execute(httpPost);
			String location = httpResponse.getFirstHeader("Location")
					.getValue();
			if (location != null && location.startsWith(loginErrorUrl)) {
				System.out.println("----loginError");
			}
			printResponse(httpResponse);

			// 执行get请求
			System.out.println("----the same client");
			HttpGet httpGet = new HttpGet(testUrl);
			System.out.println("request line:" + httpGet.getRequestLine());
			HttpResponse httpResponse1 = client.execute(httpGet);
			printResponse(httpResponse1);


			// cookie store
			setCookieStore(httpResponse);
			// context
			setContext();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭流并释放资源
				client.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	@Test
	public void testContext() throws Exception {
		System.out.println("----testContext");
		// 使用context方式
		CloseableHttpClient client = HttpClients.createDefault();
		HttpGet httpGet = new HttpGet(testUrl);
		System.out.println("request line:" + httpGet.getRequestLine());
		try {
			// 执行get请求
			HttpResponse httpResponse = client.execute(httpGet, context);
			System.out.println("context cookies:"
					+ context.getCookieStore().getCookies());
			printResponse(httpResponse);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭流并释放资源
				client.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	@Test
	public void testCookieStore() throws Exception {
		System.out.println("----testCookieStore");
		// 使用cookieStore方式
		CloseableHttpClient client = HttpClients.custom()
				.setDefaultCookieStore(cookieStore).build();
		HttpGet httpGet = new HttpGet(testUrl);
		System.out.println("request line:" + httpGet.getRequestLine());
		try {
			// 执行get请求
			HttpResponse httpResponse = client.execute(httpGet);
			System.out.println("cookie store:" + cookieStore.getCookies());
			printResponse(httpResponse);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭流并释放资源
				client.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void printResponse(HttpResponse httpResponse)
			throws ParseException, IOException {
		// 获取响应消息实体
		HttpEntity entity = httpResponse.getEntity();
		// 响应状态
		System.out.println("status:" + httpResponse.getStatusLine());
		System.out.println("headers:");
		HeaderIterator iterator = httpResponse.headerIterator();
		while (iterator.hasNext()) {
			System.out.println("\t" + iterator.next());
		}
		// 判断响应实体是否为空
		if (entity != null) {
			String responseString = EntityUtils.toString(entity);
			System.out.println("response length:" + responseString.length());
			System.out.println("response content:"
					+ responseString.replace("\r\n", ""));
		}
	}

	public static void setContext() {
		System.out.println("----setContext");
		context = HttpClientContext.create();
		Registry<CookieSpecProvider> registry = RegistryBuilder
				.<CookieSpecProvider> create()
				.register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory())
				.register(CookieSpecs.BROWSER_COMPATIBILITY,
						new BrowserCompatSpecFactory()).build();
		context.setCookieSpecRegistry(registry);
		context.setCookieStore(cookieStore);
	}

	public static void setCookieStore(HttpResponse httpResponse) {
		System.out.println("----setCookieStore");
		cookieStore = new BasicCookieStore();
		// JSESSIONID
		String setCookie = httpResponse.getFirstHeader("Set-Cookie")
				.getValue();
		String JSESSIONID = setCookie.substring("JSESSIONID=".length(),
				setCookie.indexOf(";"));
		System.out.println("JSESSIONID:" + JSESSIONID);
		// 新建一个Cookie
		BasicClientCookie cookie = new BasicClientCookie("JSESSIONID",
				JSESSIONID);
		cookie.setVersion(0);
		cookie.setDomain("127.0.0.1");
		cookie.setPath("/CwlProClient");
		// cookie.setAttribute(ClientCookie.VERSION_ATTR, "0");
		// cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "127.0.0.1");
		// cookie.setAttribute(ClientCookie.PORT_ATTR, "8080");
		// cookie.setAttribute(ClientCookie.PATH_ATTR, "/CwlProWeb");
		cookieStore.addCookie(cookie);
	}

	public static List<NameValuePair> getParam(Map parameterMap) {
		List<NameValuePair> param = new ArrayList<NameValuePair>();
		Iterator it = parameterMap.entrySet().iterator();
		while (it.hasNext()) {
			Entry parmEntry = (Entry) it.next();
			param.add(new BasicNameValuePair((String) parmEntry.getKey(),
					(String) parmEntry.getValue()));
		}
		return param;
	}
}
0
3
分享到:
评论
2 楼 sb33060418 2014-05-20  
按理说只要设对了cookie项的值是应该都可以的。我查资料的时候看到过别人连
1 楼 zhangfeikr 2014-05-13  
请问,我的这样用怎么不行,我连接的C#接口,JSESSIONID换成了服务端的ASP.NET_SessionId

相关推荐

    HttpClient3.1.jar

    HttpClient3.1.jar是Apache HttpClient库的一个版本,它在Java编程环境中用于实现HTTP客户端通信。这个库被广泛用于开发需要...在新的项目中,开发者通常会考虑使用更新的版本(如HttpClient 4.x)或替代品,如OkHttp。

    httpclient-4.5.2.jar.zip

    - **使用Cookie管理器**:对于处理需要保持会话的请求,可以使用`CookieStore`和`CookiePolicy`来管理Cookie。 - **处理重定向**:HttpClient支持自动处理重定向,但也可以通过配置关闭此功能,自定义重定向策略。...

    org.apache.commons.httpclient-3.1.jar

    《Apache Commons HttpClient 3.1:HTTP客户端编程的基石》 ...然而,需要注意的是,HttpClient 3.1已不再维护,最新的稳定版本为HttpClient 4.x,对于新项目建议使用更现代的版本以获取更好的性能和兼容性。

    Apache-HttpClient4.x详解 高清中文 pdf

    4.x版本的HttpClient提供了一系列丰富的API,使得开发者能够更加灵活和高效地实现HTTP通信。本详解将覆盖HttpClient的多个方面,包括基础使用、连接管理、状态管理、认证机制以及高级主题。 首先,HttpClient的基础...

    Java 使用HttpClient保持SESSION状态

    以上就是在Java中使用HttpClient保持SESSION状态的基本流程。在实际项目中,可能还需要处理重定向、超时、错误处理等复杂情况。注意,对于HTTPS站点,可能需要配置SSLContext和TrustManager,以允许HttpClient信任自...

    httpclient.jar4.4及4.5版本和httpcore.jar和commons-logging.jar.rar

    5. **Cookie管理**:可以自动处理服务器返回的Cookie,保持会话状态。 6. **自定义拦截器**:可以添加自定义拦截器来修改请求或响应,实现更复杂的逻辑。 7. **HTTP方法的异步执行**:通过Future或Callback接口,...

    org.apache.commons.httpclient相关架包

    5. **Cookie管理**:HttpClient可以自动处理服务器返回的cookies,保持会话状态,方便处理登录和其他需要保持状态的场景。 6. **异步请求**:虽然HttpClient主要是同步操作,但通过配合线程或者回调机制,可以实现...

    httpclient如何保持session会话模拟登录后的操作

    本篇文章将深入探讨如何使用HTTPClient来实现session会话的保持,并在模拟登录后执行后续的操作。 首先,了解HTTP协议的基础知识是非常重要的。HTTP协议是无状态的,这意味着每次请求之间没有任何关联。为了保持...

    httpclient4.2.1.zip

    5. **支持Cookie管理**:HttpClient能够自动处理服务器返回的Cookie,保持会话状态。 6. **代理设置**:支持配置HTTP代理和SOCKS代理,适应不同网络环境的需求。 7. **安全通信**:通过SSL/TLS协议支持HTTPS,确保...

    httpclient-4.3.6.jar包,安卓异步框架必备

    例如,使用`CookieStore`可以方便地管理会话cookie,而`AuthCache`则有助于处理服务器的身份验证需求。 在实际应用中,HttpClient与Android的异步框架如RxJava、Volley或OkHttp结合使用,可以构建更高效、灵活的...

    HttpClient包.rar

    8. **Cookie管理**:HttpClient支持处理HTTP会话中的Cookie,以便在多个请求之间保持状态。 9. **安全通信**:HttpClient可以与HTTPS服务器进行安全通信,支持SSL/TLS协议,需要配置SSLContext和KeyStore。 10. **...

    最新org.apache.commons.httpclient.rar

    5. **替代品与升级**:随着Java生态的发展,Apache HttpClient逐渐被更现代的库如Apache HttpComponents HttpClient 4.x系列和Java 7及更高版本内置的`java.net.HttpURLConnection`所取代。这些新库提供了更多特性,...

    经典教程httpClient4

    HttpClient 4.x版本是其最新且广泛使用的版本,它支持各种HTTP协议特性,包括基本的GET和POST请求,以及更复杂的HTTP方法如PUT、DELETE,甚至包括HTTP/1.1和HTTP/2的特性。 这篇“经典教程httpClient4”可能涵盖了...

    httpclient-4.5.3.zip

    - **Cookie管理**:内置的`CookieStore`和`CookieSpec`接口,方便处理服务器返回的Cookie信息,实现会话管理。 - **自定义编码与解码**:用户可以通过实现`EntityEncoder`和`EntityDecoder`接口,自定义请求体和...

    httpClient4jar包

    4. 使用Cookie管理器保存和发送Cookies,实现会话保持。 5. 设置请求头,如Content-Type、Accept、User-Agent等,以满足不同服务器的需求。 6. 使用实体处理,将请求体和响应体转换为各种格式,如JSON、XML等。 7. ...

    apache-commons-httpclient.jar

    3. **Cookie管理**:通过`CookiePolicy`和`CookieStore`,HttpClient可以处理服务器返回的Cookie,保持会话状态,实现登录认证等功能。 4. **URL编码与解码**:HttpClient内置了对URL编码和解码的支持,防止URL中的...

    使用HttpClient必须的jar包

    5. **Cookie管理**:HttpClient支持`CookieSpecs`和`CookieStore`,用于处理服务器返回的Cookie,实现会话保持。 6. **请求和响应处理**:HttpClient允许自定义请求实体和响应处理器,支持JSON、XML等数据格式的...

Global site tag (gtag.js) - Google Analytics