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 classTestHttpClient {//创建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";
@Testpublic voidtestLogin() throws Exception {
System.out.println("----testLogin");// //创建HttpClientBuilder//HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();// //HttpClient//CloseableHttpClient client = httpClientBuilder.build();//直接创建client
CloseableHttpClient client =HttpClients.createDefault();
HttpPost httpPost= newHttpPost(loginUrl);
Map parameterMap= newHashMap();
parameterMap.put("j_username", "sunb012");
parameterMap.put("j_password", "sunb012");
UrlEncodedFormEntity postEntity= newUrlEncodedFormEntity(
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= newHttpGet(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();
}
}
}
@Testpublic voidtestContext() throws Exception {
System.out.println("----testContext");//使用context方式
CloseableHttpClient client =HttpClients.createDefault();
HttpGet httpGet= newHttpGet(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();
}
}
}
@Testpublic voidtestCookieStore() throws Exception {
System.out.println("----testCookieStore");//使用cookieStore方式
CloseableHttpClient client =HttpClients.custom()
.setDefaultCookieStore(cookieStore).build();
HttpGet httpGet= newHttpGet(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 voidprintResponse(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 voidsetContext() {
System.out.println("----setContext");
context=HttpClientContext.create();
Registry registry =RegistryBuilder
.create()
.register(CookieSpecs.BEST_MATCH,newBestMatchSpecFactory())
.register(CookieSpecs.BROWSER_COMPATIBILITY,newBrowserCompatSpecFactory()).build();
context.setCookieSpecRegistry(registry);
context.setCookieStore(cookieStore);
}public static voidsetCookieStore(HttpResponse httpResponse) {
System.out.println("----setCookieStore");
cookieStore= newBasicCookieStore();//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 ListgetParam(Map parameterMap) {
List param = new ArrayList();
Iterator it=parameterMap.entrySet().iterator();while(it.hasNext()) {
Entry parmEntry=(Entry) it.next();
param.add(newBasicNameValuePair((String) parmEntry.getKey(),
(String) parmEntry.getValue()));
}returnparam;
}
}