httpclient妙用一 httpclient作为客户端调用webservice | http://aperise.iteye.com/blog/2223454 |
httpclient妙用二 httpclient保持会话登录 | http://aperise.iteye.com/blog/2223470 |
httpclient连接池 | http://aperise.iteye.com/blog/2295153 |
httpclient保持会话登录
1.原理
httpclient会话保持,原理是维持session会话,而session的保持是通过cookie来维持的。
本次要讲的是,得到用户cookie后,免登录,用HttpClient 保持原来session访问原本一定要登录才能做的事。
详细原理可参见http://abandontofree.blog.sohu.com/273547680.html
网上有个比较好的例子,参见http://www.cnblogs.com/yaowen/p/3757571.html
2.maven工程中引入对httpclient的依赖
<properties> <httpclient.version>4.3.2</httpclient.version> <properties> <dependencyManagement> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependencies> <!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${httpclient.version}</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>fluent-hc</artifactId> <version>${httpclient.version}</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>http-core</artifactId> <version>${httpclient.version}</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement>
3.第一种情况:每次登录后才进行后续操作
这种情况不用去处理cookie,httpclient4.x会自动处理cookie,只要使用同一httpclient,且没有手动连接放掉httpclient
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; public class KeepSessionWithOneHttpclient { /** * 如果用的是同一个HttpClient且没去手动连接放掉client.getConnectionManager().shutdown(); * 都不用去设置cookie的ClientPNames.COOKIE_POLICY。httpclient都是会保留cookie的 * @param loginUrl * @param loginNameValuePair * @param urlAndNamePairList * @return */ public static Map<String,String> doPostWithOneHttpclient(String loginUrl,List<NameValuePair> loginNameValuePair, Map<String,List<NameValuePair>> urlAndNamePairList) { //返回每个URL对应的响应信息 Map<String,String> map = new HashMap<String,String>(); String retStr = "";//每次响应信息 int statusCode = 0 ;//每次响应代码 // 创建HttpClientBuilder HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); // HttpClient CloseableHttpClient closeableHttpClient = null; closeableHttpClient = httpClientBuilder.build(); HttpPost httpPost = new HttpPost(loginUrl); // 设置请求和传输超时时间 RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(30000) .setConnectTimeout(30000).build(); httpPost.setConfig(requestConfig); UrlEncodedFormEntity entity = null; try { if(null!=loginNameValuePair){ entity = new UrlEncodedFormEntity(loginNameValuePair, "UTF-8"); httpPost.setEntity(entity); } //登录 CloseableHttpResponse loginResponse = closeableHttpClient.execute(httpPost); statusCode = loginResponse.getStatusLine().getStatusCode(); retStr = EntityUtils.toString(loginResponse.getEntity(), "UTF-8"); map.put(loginUrl, retStr); //登录后其他操作 for(Map.Entry<String,List<NameValuePair>> entry : urlAndNamePairList.entrySet()){ String url = entry.getKey(); List<NameValuePair> params = urlAndNamePairList.get(url); httpPost = new HttpPost(url); if(null!=params){ entity = new UrlEncodedFormEntity(params, "UTF-8"); httpPost.setEntity(entity); } CloseableHttpResponse operationResponse = closeableHttpClient.execute(httpPost); statusCode = operationResponse.getStatusLine().getStatusCode(); retStr = EntityUtils.toString(operationResponse.getEntity(), "UTF-8"); map.put(url, retStr); if(statusCode == 302){ String redirectUrl = operationResponse.getLastHeader("Location").getValue(); httpPost = new HttpPost(redirectUrl); CloseableHttpResponse redirectResponse = closeableHttpClient.execute(httpPost); statusCode = redirectResponse.getStatusLine().getStatusCode(); retStr = EntityUtils.toString(redirectResponse.getEntity(), "UTF-8"); map.put(redirectUrl, retStr); } } // 释放资源 closeableHttpClient.close(); } catch (Exception e) { e.printStackTrace(); } return map; } public static void main(String[] args) { //登录的地址以及登录操作参数 String loginUrl = "http://public_ip/xxx/sso_login"; //登录的相关参数以及登录后操作参数 List<NameValuePair> loginParams = new ArrayList<NameValuePair>(); loginParams.add(new BasicNameValuePair("sso_callback_uri","/xxx/forward?locale=zh_CN")); loginParams.add(new BasicNameValuePair("appName", "xxx")); loginParams.add(new BasicNameValuePair("username", "xxx")); loginParams.add(new BasicNameValuePair("password", "xxx")); //登录后操作地址以及登录后操作参数 String queryUrl = "http://public_ip/xxx/system/getRegionList.do"; List<NameValuePair> queryParams = new ArrayList<NameValuePair>(); queryParams.add(new BasicNameValuePair("regionNo", "xxx")); queryParams.add(new BasicNameValuePair("pageNo", "xxx")); queryParams.add(new BasicNameValuePair("pageSize", "xxx")); Map<String,List<NameValuePair>> map = new HashMap<String,List<NameValuePair>>(); map.put(queryUrl, queryParams); Map<String,String> returnMap = doPostWithOneHttpclient(loginUrl, loginParams, map); System.out.println(returnMap.toString()); } }
4.第二种情况:登录一次,后续使用之前登录时的cookie
登录后,将cookie保存起来,待有其他操作时,不用再次登录,首先设置cookie,然后调用操作
import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.CookieStore; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.cookie.BasicClientCookie; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; public class LoginWithHttpclient { static CookieStore cookieStore = null; /** * 组装登录参数 * @return */ public static List<NameValuePair> getLoginNameValuePairList() { List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("sso_callback_uri","/xxx/forward?locale=zh_CN")); params.add(new BasicNameValuePair("appName", "xxx")); params.add(new BasicNameValuePair("username", "xxx")); params.add(new BasicNameValuePair("password", "xxx")); return params; } /** * 组装操作参数 * @return */ public static List<NameValuePair> getQueryNameValuePairList() { List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("regionNo", "xxx")); params.add(new BasicNameValuePair("pageNo", "xxx")); params.add(new BasicNameValuePair("pageSize", "xxx")); return params; } /** * 将cookie保存到静态变量中供后续调用 * @param httpResponse */ 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("domain"); cookie.setPath("/xxx"); cookieStore.addCookie(cookie); } public static String doPost(String postUrl,List<NameValuePair> parameterList) { String retStr = ""; // 创建HttpClientBuilder HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); // HttpClient CloseableHttpClient closeableHttpClient = null; if(cookieStore!=null){ closeableHttpClient = httpClientBuilder.setDefaultCookieStore(cookieStore).build(); }else{ closeableHttpClient = httpClientBuilder.build(); } HttpPost httpPost = new HttpPost(postUrl); // 设置请求和传输超时时间 RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(30000).setConnectTimeout(30000).build(); httpPost.setConfig(requestConfig); try { UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameterList, "UTF-8"); httpPost.setEntity(entity); CloseableHttpResponse response = closeableHttpClient.execute(httpPost); setCookieStore(response); HttpEntity httpEntity = response.getEntity(); retStr = EntityUtils.toString(httpEntity, "UTF-8"); System.out.println(retStr); // 释放资源 closeableHttpClient.close(); } catch (Exception e) { } return retStr; } public static void main(String[] args) { String loginUrl = "http://domain/xxx/sso_login"; String queryReginUrl = "http://domani/xxx/system/getRegionList.do"; //第一次登录会保存cookie doPost(loginUrl, getLoginNameValuePairList()); //第二次操作会调用已经存在的cookie doPost(queryReginUrl, getQueryNameValuePairList()); } }
相关推荐
NULL 博文链接:https://shaozhen.iteye.com/blog/946680
为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用java.net.HttpURLConnection来完成这些功能时是多么恐怖的事情啊!况且这仅仅是我们所说...
Java的HttpClient帮助类 自己以前写的java模拟请求帮助类 1、包含header头构造 2、会话session维持 3、使用HttpClient 详细见博客链接:https://blog.csdn.net/zhulinniao/article/details/103651687
uTLS是“ crypto / tls”的一个分支,它提供ClientHello指纹抗性,对握手的低级别访问,伪造的会话票证和其他一些功能。 握手仍由“ crypto / tls”执行,该库仅更改其中的ClientHello部分并提供低级访问(来自 )...
jun_plugin项目项目说明jun_plugin整合Java企业级各种开发组件,开箱即用,不写重复代码笔者其他项目功能实现和使用jun_springboot:jun_springcloud:基础篇:企业级开发组件功能列表(jun_plugin) 【fastdfs-...
jun_plugin整合Java企业级各种开发组件,开箱即用,不写重复代码 笔者其他项目功能实现和使用 jun_springboot: jun_springcloud: 基础篇:企业级开发组件功能列表(jun_plugin) 【fastdfs-client-java】 【jun_...
Ektorp GAEHttpClient ... 此时的基本和会话身份验证 用法 带有所有选项的GAEHttpClient.Builder (源代码中有更多文档): import io.github.oliverdm.ektorp.http.GAEHttpClient; import org.ektorp.CouchDbIn
Delphi两种方法演示HTTP请求:GET/POST方法使用演示,程序将演示使用这两种方法建立会话、建立一个http请求句柄、发送一个指定请求到httpserver、接收header信息和一个http请求、指向一个接收请求信息的缓冲区的指针...
22、支持报警消息(设备上线、下线和设备端报警)通过httpclient方式主动通知 23、支持公网和局域网同时存在 24、支持httpserver,接口支持http+json 25、支持设备上线、下线和设备报警通过httpclient...
Connection: keep-alive用法Connection: keep-alive和SSL会话重用可减少SSL握手的开销并加快数据传输。依存关系该库是自包含的,只需要Arduino和ESP32系统库。 运行示例还需要WiFi库。设定说明安装该库的步骤取决于...
1、支持国标GB28181平台、国标GB28181 IPC和国标GB28181 NVR设备同时接入 (支持GB28181-2011版本和... 22、支持报警消息(设备上线、下线和设备端报警)通过httpclient方式主动通知 23、支持公网和局域网同时存在
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
Java的世界里,HttpClient 是一个功能强大的Http请求库,然而接口非常复杂,设计上遵从正交性,简单的请求也需要写比较多的代码,更不要说隐藏在各种细节里面的高级用法了。Requests, 是一个模仿python requests ...