`

httpclient妙用二 httpclient保持会话登录

阅读更多
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());
	}
}

 

分享到:
评论

相关推荐

    httpclient如何保持session会话模拟登录后的操作

    本篇文章将深入探讨如何使用HTTPClient来实现session会话的保持,并在模拟登录后执行后续的操作。 首先,了解HTTP协议的基础知识是非常重要的。HTTP协议是无状态的,这意味着每次请求之间没有任何关联。为了保持...

    Java 使用HttpClient保持SESSION状态

    在处理Web应用程序时,有时我们需要保持用户的登录状态,即SESSION状态。这通常涉及到Cookie管理,因为服务器通过Cookie来跟踪客户端的会话。下面我们将详细探讨如何在Java中使用HttpClient来实现这一目标。 首先,...

    HttpClient模拟登录实例

    在实际应用中,为了保持会话状态,通常需要处理服务器返回的cookies。HttpClient提供了`CookieStore`接口,可以用来存储和管理cookies。 总之,HttpClient提供了一套强大的API,使Java开发者能够轻松地模拟浏览器...

    HttpClient 登录163邮箱

    - 如果登录成功,服务器可能会返回一个会话cookie,HttpClient需要保存这个cookie以保持登录状态。 3. **HttpClient API使用** - `HttpClient`实例化:创建一个`HttpClient`对象,可以设置连接超时、重试策略等...

    使用HttpClient登录网易邮箱

    对于登录操作,可能需要解析返回的Cookie,以便后续的会话保持。 8. **异常处理**:捕获并处理可能出现的网络异常、解析异常等。 9. **关闭连接**:记得在操作完成后关闭HttpClient和响应的连接,释放资源。 在...

    使用httpclient4登录blog.com

    以下是一个简单的使用HttpClient 4登录博客网站的步骤: 1. **创建HttpClient实例**:首先,我们需要创建一个`CloseableHttpClient`对象,这是HttpClient的主要入口点。我们可以使用`HttpClientBuilder`来构建它,...

    httpclient4.2.1.zip

    5. **支持Cookie管理**:HttpClient能够自动处理服务器返回的Cookie,保持会话状态。 6. **代理设置**:支持配置HTTP代理和SOCKS代理,适应不同网络环境的需求。 7. **安全通信**:通过SSL/TLS协议支持HTTPS,确保...

    (最新)HttpClient4模拟登录腾讯微博

    如果登录成功,后续的请求可以复用这个带有Cookie的HttpClient实例,以便维持会话状态。例如,要访问用户主页,只需构造一个新的HttpGet请求,并设置相应的URL。 在实际应用中,`h_login_11.js`文件可能是腾讯微博...

    HTTPClient 的一个封装

    - **Cookie管理**:处理服务器返回的Cookie,保持会话状态。 - **SSL/TLS支持**:配置SSL上下文,处理HTTPS请求。 - **重试策略**:当请求失败时,自动按照预设策略进行重试。 - **线程安全**:确保封装的HttpClient...

    Httpclient依赖包

    4. **Cookie管理**:HttpClient内置了Cookie管理器,可以处理服务器返回的Cookie,保持会话状态,支持标准的Cookie规范。 5. **SSL/TLS支持**:HttpClient支持安全的HTTPS通信,可以自定义SSL上下文,处理证书、...

    使用HttpClient必须的jar包

    5. **Cookie管理**:HttpClient支持`CookieSpecs`和`CookieStore`,用于处理服务器返回的Cookie,实现会话保持。 6. **请求和响应处理**:HttpClient允许自定义请求实体和响应处理器,支持JSON、XML等数据格式的...

    httpclient-4.5.3中文版文档,很实用

    9. **Cookie管理**:HttpClient处理HTTP会话状态,支持标准的Cookie规范,如RFC6265。 10. **国际化支持**:如标题所示,HttpClient 4.5.3提供了中文版文档,便于中国开发者理解和使用。 在使用HttpClient时,...

    httpclient4.1.2.zip

    此外,HttpClient 4.1.2还提供了对cookies的处理,通过`CookieStore`和`CookieSpec`接口,可以实现cookies的存储、读取和管理,从而保持会话状态。 在错误处理上,HttpClient 4.1.2引入了重试策略,当网络不稳定...

    commons-httpclient.rar

    4. **Cookie管理**:支持自动处理服务器返回的Cookie,方便进行会话管理。 5. **HTTP代理支持**:HttpClient可以配置通过HTTP或HTTPS代理进行通信,支持基本的代理认证协议。 6. **身份验证**:HttpClient支持多种...

    httpclient-4.5.2.jar.zip

    - **使用Cookie管理器**:对于处理需要保持会话的请求,可以使用`CookieStore`和`CookiePolicy`来管理Cookie。 - **处理重定向**:HttpClient支持自动处理重定向,但也可以通过配置关闭此功能,自定义重定向策略。...

    HttpClient依赖jar包.zip

    9. **Cookie管理**:HttpClient可以管理Cookie,处理会话保持和跨域问题。 在实际应用中,为了使用HttpClient,你需要将zip文件中的jar包解压后添加到项目的类路径中。同时,根据项目需求,可能还需要添加其他依赖...

    httpclient-4.5.3.zip

    《HttpClient 4.5.3:构建高效网络通信的核心库》 Apache HttpClient 是一个广泛使用的 Java 库,专为执行HTTP请求而设计。在版本4.5.3中,这个库提供了一系列强大的功能,使开发者能够高效、灵活地处理网络通信...

Global site tag (gtag.js) - Google Analytics