HttpClient4.x 使用cookie保持会话
来源:互联网 发布:杭州汉聚网络骚扰电话 编辑:程序博客网 时间:2024/04/26 14:47
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 0
- HttpClient4.x 使用cookie保持会话
- HttpClient4.x 使用cookie保持会话
- HttpClient4.x 使用cookie保持会话
- HttpClient4.x 使用cookie保持会话
- HttpClient4.x 使用cookie保持会话
- HttpClient4.5.2 使用cookie保持会话——获取cookie
- HttpClient4.5.2 使用cookie保持会话——获取cookie之后如何传递它
- [Android] 使用Cookie保持会话
- [Android] 使用Cookie保持会话
- struts之Cookie会话保持
- HttpClient4.x 使用总结
- httpClient4.3x 使用
- HttpClient4.x —— Cookie 版本
- 会话状态保持,JSESSIONID,COOKIE,URL重写
- 会话状态保持,JSESSIONID,COOKIE,URL重写
- 会话状态保持,JSESSIONID,COOKIE,URL重写
- 会话状态保持,JSESSIONID,COOKIE,URL重写
- 使用httpclient4.3.X模拟post请求登陆网站获取cookie信息的操作
- 云计算也分“层” 一句话读懂IaaS、PaaS、SaaS
- OpenGL绘制纹理,缩放相机导致纹理闪烁的解决方法gluPerspective ()
- Taglib编译
- 服务器推送技术常用的三个解决方案
- 关于xcode的导入的文件出现问号的问题
- HttpClient4.x 使用cookie保持会话
- NoClassDefFoundError --如何引入外部jar包
- php中大括号的用法和意义{}
- 对android:configChanges属性,一般认为有以下几点:
- Android Studio导入项目的几种方法
- Oracle日期、字符串格式化函数,位数不足前面加0,一位数字显示两位,格式化数字为定长
- 将maven项目打包为可执行的jar
- 微信oauth2.0和自定义菜单携带openid
- Deep Learning Books