httpclient妙用二 httpclient保持会话登录

httpclient妙用一 httpclient作为客户端调用webservicehttp://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的依赖

Xml代码   收藏代码
  1. <properties>  
  2.     <httpclient.version>4.3.2</httpclient.version>  
  3. <properties>  
  4. <dependencyManagement>  
  5.     <dependency>  
  6.         <groupId>commons-logging</groupId>  
  7.         <artifactId>commons-logging</artifactId>  
  8.         <version>1.1.1</version>  
  9.     </dependency>  
  10.     <dependencies>  
  11.             <!-- httpclient -->  
  12.     <dependency>  
  13.         <groupId>org.apache.httpcomponents</groupId>  
  14.         <artifactId>httpclient</artifactId>  
  15.         <version>${httpclient.version}</version>  
  16.         <exclusions>  
  17.             <exclusion>  
  18.                 <groupId>commons-logging</groupId>  
  19.                 <artifactId>commons-logging</artifactId>  
  20.             </exclusion>  
  21.         </exclusions>  
  22.     </dependency>  
  23.   
  24.     <dependency>  
  25.         <groupId>org.apache.httpcomponents</groupId>  
  26.         <artifactId>fluent-hc</artifactId>  
  27.         <version>${httpclient.version}</version>  
  28.         <exclusions>  
  29.             <exclusion>  
  30.                 <groupId>commons-logging</groupId>  
  31.                 <artifactId>commons-logging</artifactId>  
  32.             </exclusion>  
  33.         </exclusions>  
  34.     </dependency>  
  35.   
  36.     <dependency>  
  37.         <groupId>org.apache.httpcomponents</groupId>  
  38.         <artifactId>http-core</artifactId>  
  39.         <version>${httpclient.version}</version>  
  40.         <exclusions>  
  41.             <exclusion>  
  42.                 <groupId>commons-logging</groupId>  
  43.                 <artifactId>commons-logging</artifactId>  
  44.             </exclusion>  
  45.         </exclusions>  
  46.     </dependency>  
  47. </dependencies>  
  48. lt;/dependencyManagement>  

 

3.第一种情况:每次登录后才进行后续操作

   这种情况不用去处理cookie,httpclient4.x会自动处理cookie,只要使用同一httpclient,且没有手动连接放掉httpclient

Java代码   收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5. import org.apache.http.NameValuePair;  
  6. import org.apache.http.client.config.RequestConfig;  
  7. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  8. import org.apache.http.client.methods.CloseableHttpResponse;  
  9. import org.apache.http.client.methods.HttpPost;  
  10. import org.apache.http.impl.client.CloseableHttpClient;  
  11. import org.apache.http.impl.client.HttpClientBuilder;  
  12. import org.apache.http.message.BasicNameValuePair;  
  13. import org.apache.http.util.EntityUtils;  
  14.   
  15. public class KeepSessionWithOneHttpclient {  
  16.     /** 
  17.      * 如果用的是同一个HttpClient且没去手动连接放掉client.getConnectionManager().shutdown(); 
  18.      * 都不用去设置cookie的ClientPNames.COOKIE_POLICY。httpclient都是会保留cookie的 
  19.      * @param loginUrl 
  20.      * @param loginNameValuePair 
  21.      * @param urlAndNamePairList 
  22.      * @return 
  23.      */  
  24.     public static Map<String,String> doPostWithOneHttpclient(String loginUrl,List<NameValuePair> loginNameValuePair,  
  25.             Map<String,List<NameValuePair>> urlAndNamePairList) {  
  26.         //返回每个URL对应的响应信息  
  27.         Map<String,String> map = new HashMap<String,String>();  
  28.         String retStr = "";//每次响应信息  
  29.         int statusCode = 0 ;//每次响应代码  
  30.           
  31.         // 创建HttpClientBuilder  
  32.         HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();  
  33.         // HttpClient  
  34.         CloseableHttpClient closeableHttpClient = null;  
  35.         closeableHttpClient = httpClientBuilder.build();  
  36.         HttpPost httpPost = new HttpPost(loginUrl);  
  37.         // 设置请求和传输超时时间  
  38.         RequestConfig requestConfig = RequestConfig.custom()  
  39.                 .setSocketTimeout(30000)  
  40.                 .setConnectTimeout(30000).build();  
  41.         httpPost.setConfig(requestConfig);  
  42.         UrlEncodedFormEntity entity = null;  
  43.         try {  
  44.             if(null!=loginNameValuePair){  
  45.                 entity = new UrlEncodedFormEntity(loginNameValuePair, "UTF-8");  
  46.                 httpPost.setEntity(entity);  
  47.             }  
  48.             //登录  
  49.             CloseableHttpResponse loginResponse = closeableHttpClient.execute(httpPost);  
  50.             statusCode = loginResponse.getStatusLine().getStatusCode();  
  51.             retStr = EntityUtils.toString(loginResponse.getEntity(), "UTF-8");  
  52.             map.put(loginUrl, retStr);  
  53.               
  54.             //登录后其他操作  
  55.             for(Map.Entry<String,List<NameValuePair>> entry : urlAndNamePairList.entrySet()){  
  56.                 String url = entry.getKey();  
  57.                 List<NameValuePair> params = urlAndNamePairList.get(url);  
  58.                 httpPost = new HttpPost(url);  
  59.                 if(null!=params){  
  60.                     entity = new UrlEncodedFormEntity(params, "UTF-8");  
  61.                     httpPost.setEntity(entity);  
  62.                 }  
  63.                 CloseableHttpResponse operationResponse = closeableHttpClient.execute(httpPost);  
  64.                 statusCode = operationResponse.getStatusLine().getStatusCode();  
  65.                 retStr = EntityUtils.toString(operationResponse.getEntity(), "UTF-8");  
  66.                 map.put(url, retStr);  
  67.                   
  68.                 if(statusCode == 302){  
  69.                     String redirectUrl = operationResponse.getLastHeader("Location").getValue();  
  70.                     httpPost = new HttpPost(redirectUrl);  
  71.                     CloseableHttpResponse redirectResponse = closeableHttpClient.execute(httpPost);  
  72.                     statusCode = redirectResponse.getStatusLine().getStatusCode();  
  73.                     retStr = EntityUtils.toString(redirectResponse.getEntity(), "UTF-8");  
  74.                     map.put(redirectUrl, retStr);  
  75.                 }  
  76.             }  
  77.             // 释放资源  
  78.             closeableHttpClient.close();  
  79.         } catch (Exception e) {  
  80.             e.printStackTrace();  
  81.         }  
  82.         return map;  
  83.     }  
  84.   
  85.     public static void main(String[] args) {  
  86.         //登录的地址以及登录操作参数  
  87.         String loginUrl = "http://public_ip/xxx/sso_login";  
  88.         //登录的相关参数以及登录后操作参数  
  89.         List<NameValuePair> loginParams = new ArrayList<NameValuePair>();  
  90.         loginParams.add(new BasicNameValuePair("sso_callback_uri","/xxx/forward?locale=zh_CN"));  
  91.         loginParams.add(new BasicNameValuePair("appName""xxx"));  
  92.         loginParams.add(new BasicNameValuePair("username""xxx"));  
  93.         loginParams.add(new BasicNameValuePair("password""xxx"));  
  94.           
  95.         //登录后操作地址以及登录后操作参数  
  96.         String queryUrl = "http://public_ip/xxx/system/getRegionList.do";  
  97.         List<NameValuePair> queryParams = new ArrayList<NameValuePair>();  
  98.         queryParams.add(new BasicNameValuePair("regionNo""xxx"));  
  99.         queryParams.add(new BasicNameValuePair("pageNo""xxx"));  
  100.         queryParams.add(new BasicNameValuePair("pageSize""xxx"));  
  101.   
  102.         Map<String,List<NameValuePair>> map = new HashMap<String,List<NameValuePair>>();  
  103.         map.put(queryUrl, queryParams);  
  104.         Map<String,String> returnMap = doPostWithOneHttpclient(loginUrl, loginParams, map);  
  105.         System.out.println(returnMap.toString());  
  106.     }  
  107. }  

 

 4.第二种情况:登录一次,后续使用之前登录时的cookie

    登录后,将cookie保存起来,待有其他操作时,不用再次登录,首先设置cookie,然后调用操作

Java代码   收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import org.apache.http.HttpEntity;  
  4. import org.apache.http.HttpResponse;  
  5. import org.apache.http.NameValuePair;  
  6. import org.apache.http.client.CookieStore;  
  7. import org.apache.http.client.config.RequestConfig;  
  8. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  9. import org.apache.http.client.methods.CloseableHttpResponse;  
  10. import org.apache.http.client.methods.HttpPost;  
  11. import org.apache.http.impl.client.BasicCookieStore;  
  12. import org.apache.http.impl.client.CloseableHttpClient;  
  13. import org.apache.http.impl.client.HttpClientBuilder;  
  14. import org.apache.http.impl.cookie.BasicClientCookie;  
  15. import org.apache.http.message.BasicNameValuePair;  
  16. import org.apache.http.util.EntityUtils;  
  17.   
  18. public class LoginWithHttpclient {  
  19.     static CookieStore cookieStore = null;  
  20.   
  21.     /** 
  22.      * 组装登录参数 
  23.      * @return 
  24.      */  
  25.     public static List<NameValuePair> getLoginNameValuePairList() {  
  26.         List<NameValuePair> params = new ArrayList<NameValuePair>();  
  27.         params.add(new BasicNameValuePair("sso_callback_uri","/xxx/forward?locale=zh_CN"));  
  28.         params.add(new BasicNameValuePair("appName""xxx"));  
  29.         params.add(new BasicNameValuePair("username""xxx"));  
  30.         params.add(new BasicNameValuePair("password""xxx"));  
  31.         return params;  
  32.     }  
  33.     /** 
  34.      * 组装操作参数 
  35.      * @return 
  36.      */  
  37.     public static List<NameValuePair> getQueryNameValuePairList() {  
  38.         List<NameValuePair> params = new ArrayList<NameValuePair>();  
  39.         params.add(new BasicNameValuePair("regionNo""xxx"));  
  40.         params.add(new BasicNameValuePair("pageNo""xxx"));  
  41.         params.add(new BasicNameValuePair("pageSize""xxx"));  
  42.         return params;  
  43.     }  
  44.     /** 
  45.      * 将cookie保存到静态变量中供后续调用 
  46.      * @param httpResponse 
  47.      */  
  48.     public static void setCookieStore(HttpResponse httpResponse) {  
  49.         System.out.println("----setCookieStore");  
  50.         cookieStore = new BasicCookieStore();  
  51.         // JSESSIONID  
  52.         String setCookie = httpResponse.getFirstHeader("Set-Cookie").getValue();  
  53.         String JSESSIONID = setCookie.substring("JSESSIONID=".length(),  
  54.                 setCookie.indexOf(";"));  
  55.         System.out.println("JSESSIONID:" + JSESSIONID);  
  56.         // 新建一个Cookie  
  57.         BasicClientCookie cookie = new BasicClientCookie("JSESSIONID",JSESSIONID);  
  58.         cookie.setVersion(0);  
  59.         cookie.setDomain("domain");  
  60.         cookie.setPath("/xxx");  
  61.         cookieStore.addCookie(cookie);  
  62.     }  
  63.   
  64.     public static String doPost(String postUrl,List<NameValuePair> parameterList) {  
  65.         String retStr = "";  
  66.         // 创建HttpClientBuilder  
  67.         HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();  
  68.         // HttpClient  
  69.         CloseableHttpClient closeableHttpClient = null;  
  70.         if(cookieStore!=null){  
  71.             closeableHttpClient = httpClientBuilder.setDefaultCookieStore(cookieStore).build();  
  72.         }else{  
  73.             closeableHttpClient = httpClientBuilder.build();  
  74.         }  
  75.         HttpPost httpPost = new HttpPost(postUrl);  
  76.         // 设置请求和传输超时时间  
  77.         RequestConfig requestConfig = RequestConfig.custom()  
  78.                 .setSocketTimeout(30000).setConnectTimeout(30000).build();  
  79.         httpPost.setConfig(requestConfig);  
  80.         try {  
  81.             UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameterList, "UTF-8");  
  82.             httpPost.setEntity(entity);  
  83.             CloseableHttpResponse response = closeableHttpClient.execute(httpPost);  
  84.             setCookieStore(response);  
  85.   
  86.             HttpEntity httpEntity = response.getEntity();  
  87.             retStr = EntityUtils.toString(httpEntity, "UTF-8");  
  88.             System.out.println(retStr);  
  89.             // 释放资源  
  90.             closeableHttpClient.close();  
  91.         } catch (Exception e) {  
  92.         }  
  93.         return retStr;  
  94.     }  
  95.   
  96.     public static void main(String[] args) {  
  97.         String loginUrl = "http://domain/xxx/sso_login";  
  98.         String queryReginUrl = "http://domani/xxx/system/getRegionList.do";  
  99.         //第一次登录会保存cookie  
  100.         doPost(loginUrl, getLoginNameValuePairList());  
  101.         //第二次操作会调用已经存在的cookie  
  102.         doPost(queryReginUrl, getQueryNameValuePairList());  
  103.     }  
  104. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值