HttpClient4.x 使用cookie保持会话

本文介绍如何使用HttpClient4.x维持会话,包括利用CookieStore和HttpClientContext两种方法。通过示例代码展示了一次登录后的会话如何在后续请求中复用。
原文地址为: HttpClient4.x 使用cookie保持会话

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

 


转载请注明本文地址: HttpClient4.x 使用cookie保持会话
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值