java httpclient 保存cookie_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 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;

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值