使用httpClient模拟登陆开心网过程中登陆成功但是跳转不成功

package com.haojiahong.test;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
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.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

public class KaixinLoginTest {

	// The HttpClient is used in one session
	private static HttpResponse response;
	private static DefaultHttpClient httpclient = new DefaultHttpClient();

	public static void main(String[] args) throws Exception {
		KaixinLoginTest kaixin = new KaixinLoginTest();
		kaixin.printText();
	}

	// 原因就是在这里,一开始使用post提交url,可是这个url这是一个类似jsp的地址,给它参数后他并不走后台业务逻辑判断,
	// 因此也就不会返回给你正确的跳转地址,即使你测试得到了正确的statusCode
	// 所以一定要是用请求后台acting的地址,actionUrl,这个可以去对应的网页源码中查到。
	private static String url = "http://www.kaixin001.com/login/login.php";

	private static String actionUrl = "https://security.kaixin001.com/login/login_post.php";

	private boolean login() {
		HttpPost httpost = new HttpPost(actionUrl);

		BasicNameValuePair username = new BasicNameValuePair("email",
				"**********你的账号*******");
		BasicNameValuePair password = new BasicNameValuePair("password",
				"**********你的密码*******");
		List<NameValuePair> nvps = new ArrayList<NameValuePair>();

		nvps.add(username);
		nvps.add(password);

		try {
			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
			response = httpclient.execute(httpost);
			//302表示临时跳转地址。
			System.out.println(response.getStatusLine().getStatusCode()
					+ "++++++++++++++++++++++++++++++++++++++++++++");

		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			httpost.abort();
		}
		return true;
	}

	private String getRedirectLocation() {
		//跳转成功后,这里会收到一个完整的url地址,而不是类似于"/home/"这样的地址。
		String location = response.getFirstHeader("Location").getValue();

		if (location == null) {
			return null;
		}
		return location;
	}

	private String getText(String redirectLocation) {
		HttpGet httpget = new HttpGet(redirectLocation);

		ResponseHandler<String> responseHandler = new BasicResponseHandler();
		String responseBody = "";
		try {
			//打印出来跳转成功后的页面源码。
			responseBody = httpclient.execute(httpget, responseHandler);
		} catch (Exception e) {
			e.printStackTrace();
			responseBody = null;
		} finally {
			httpget.abort();
			httpclient.getConnectionManager().shutdown();
		}
		return responseBody;
	}

	public void printText() {
		if (login()) {
			String redirectLocation = getRedirectLocation();
			if (redirectLocation != null) {
				System.out.println(getText(redirectLocation));
			}
		}
	}
}//有些网站会对参数进行加密,action请求地址也写的不明确,比如博客园网站,还没有学会改怎么去模拟登陆,欢迎大神指教。
时间: 2024-10-10 18:37:02

使用httpClient模拟登陆开心网过程中登陆成功但是跳转不成功的相关文章

python模拟websocket握手过程中计算sec-websocket-accept

背景 以前,很多网站使用轮询实现推送技术.轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器.轮询的缺点很明显,浏览器需要不断的向服务器发出请求,然而HTTP请求的header是非常长 的,而实际传输的数据可能很小,这就造成了带宽和服务器资源的浪费. Comet使用了AJAX改进了轮询,可以实现双向通信.但是Comet依然需要发出请求,而且在Comet中,普遍采用了长链接,这也会大量消耗服务器带宽和资源. 于是,WebSocke

HTTPclient模拟登陆交大图书馆

最近想做一个图书馆的客户端,由于学校没有提供API,只能模拟登陆然后爬取数据了. 首先要解决的就是登陆问题,其实会了之后并不难,我在此竟然耗费了两天--都是一些细节问题. 采用HTTPclient模拟请求,需要注意: HttpClient(DefaultHttpClient)代表了一个会话,在同一个会话中,HttpClient对cookie自动进行管理(当然,也可以在程序中进行控制). 在同一个会话中,当使用post或是get发起一个新的请求时,一般需要对调用前一个会话的abort()方法,否则

httpClient模拟浏览器登陆之谜

httpClient能够模拟浏览器进行自动登陆,但是如果页面上加了一个小小的验证码,自动登陆就会变的非常非常之复杂. 下面我们讨论的问题,都是不考虑有验证码等防止自动化登陆的情况下进行处理. 利用httpClient进行一个简单的登陆示例: packagetest.ffm83.commons.httpClient; importjava.util.ArrayList; importjava.util.List; importorg.apache.http.HttpEntity; importor

JAVA--利用HttpClient模拟浏览器登陆请求获取响应的Cookie

在通过java采集网页数据时,我们常常会遇到这样的问题: 站点需要登陆才能访问 而这种网站,一般都会对请求进行账号密码的验证,验证的方式也有多种,需要具体分析. 今天分析其中的一种情况: 站点对登陆密码进行动态加密,作为Cookie响应给客户端,之后的请求需要携带加密后的密码进行访问 登陆成功的响应头如下图: 之后的请求头: 因为每次登陆生成一个新的加密密码,所以之前的密码会失效 所以,需要在每次采集之前,先模拟登陆获取响应的密码,再作为cookie继续请求,我们选择采用HttpClient模拟

vs 或 Sql server2012连接Sql server时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误

以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接,但在登陆过程中发生错误.(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确.)(Microsoft SQL Server) 然后就Management崩溃了. 没办法,那就使用vs当中的服务器资源管理器连接吧,结果可想而知,其中vs版本2008,2010,2

使用Httpclient模拟登陆正方软件股份有限公司开发的教务管理系统

事先声明,我写这篇,只是为了分享一下,登录网站不止有使用cookies这一种方法,还有一种使用随机码的方法,并没有泄露"商业机密"的想法,本人才疏学浅,只是在站在巨人的肩膀上,摘到了一个小小的苹果... 毕设ing... 有一模块就是获取教务管理系统里面对应学号的学生信息,并有后续的操作!正常情况下,为了实现这些功能必须要求用户正确登陆!有一段时间学习HttpClient,并在网上寻找关于HttpClent模拟登录网站的blog和demo学习,但是找的很多都是这样说"在获取验

爬虫登陆验证过程

混合模式 结合二.三两大步,通过模拟点击快速拿到cookie,虽然效率低,但可以减少数据包分析的时间以及解决搞不定ajax登陆验证的烦恼,然后继续用urllib2拼接cookie继续快速获取数据.分下面两步: a. 从selenium中拿到cookie b. 添加cookie给urllib2使用 方法1:使用CookieJar,可参考<Creating Custom Cookies for HTTP Requests> 方法2:直接拼凑一个名称是"Cookie"的heade

android 学习过程中登陆失效的个人理解

今天在学习的过程中,要做登陆失效的功能,所以就找了些资料,好好看了一下,研究了一番,慢慢的做出来了! 比如:你在一个手机端登陆了账号,在另外的一个手机端也登陆了账号,此时,前一个手机端的账号会提示登陆失效. 意思是只能存在一个账号,这个其实不是很难. 每次登陆的时候会存在一个Token,每次登陆的Token是不一样的! 下面贴一下前端的一些小代码: 在异步网络请求里面判断返回的异常是否是登陆失效: @Override protected void onPostExecute(BusinessRe

Ubuntu系统中登陆阿里云服务器的方法

如果您购买了阿里云服务器,恰巧又在使用Ubuntu操作系统,那么恭喜你来对地方了,今天给大家分享一下如何在Ubuntu中登陆阿里云服务器: 主要使用两款软件:1.SecureCRT:2.SecureFX:前者是命令行界面,功能类似xShell,后者则提供了图形操作界面,权且当做是xFTP吧,xShell和xFTP是我以前在windows系统中使用的服务器连接软件,它有类似Linux的终端模拟,同时可以配合xFTP显示图形界面,后来换用Ubuntu之后,找到了SecureCRT和SecureFX用