httpclient 模拟登录 及线程安全


//登录csdn
//        String uri = "https://passport.csdn.net/account/login";
//        String html = HttpUtil.DownHtml(uri);
        
//        <input type="hidden" name="lt" value="LT-207426-moK0sGnfCa9aqijJKeLYhFDYiEe2id" />
//         <input type="hidden" name="execution" value="e1s1" />
//        <input type="hidden" name="_eventId" value="submit" />
        
//        String lt = getGroup_1("name=\"lt\" value=\"(.*?)\"", html);
//        String execution = getGroup_1("name=\"execution\" value=\"(.*?)\"", html);
//        System.out.println(lt + "\t" + execution);
//        
//        //构建cookie
//        Map<String, String> params = new HashMap<String,String>();
//        params.put("_eventId", "submit");
//        params.put("execution", execution);
//        params.put("lt", lt);
//        params.put("password", "biantai123");
//        params.put("username", "[email protected]");
//        
//        HttpUtil.Post(uri, params);

模拟登录流程:

1 请求host_url

2 从host_url中解析出 隐藏表单 的值 添加到POST_DATA中

3 添加账户,密码到POST_DATA中

4 编码后,发送POST请求
    要点1:java下,HttpClient必须是单例模式
    要点2:post的url可能跟登录界面的url不同。post_url可以从host_url的返回结果中得到(具体情况自行分析)
    
5 通过firefox,chrome等相关插件验证登录完成

6 测试需要登录的采集任务

登录插件工厂设计:

设计目标(粗略):

接口设计:

public interface ILogin {
    //HttpClient
    public HttpClient login(String usr, String pwd, Map<k, v> metadata);
}

example:

public class BaiduLogin implements ILogin {

    @Override
    public HttpClient login(String usr, String pwd, Map<k, v> metadata) {
        System.out.println("萤火虫在飞");
    }
    
}

//采用线程安全的方式返回HttpClient。。。返回HttpClient  或者 返回cookie  具体待定
public static synchronized HttpClient getSaveHttpClient(){  
        if(mHttpClient == null){  
            HttpParams params = new BasicHttpParams();  
            //设置基本参数  
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
            HttpProtocolParams.setContentCharset(params, CHARSET);  
            HttpProtocolParams.setUseExpectContinue(params, true);  
            //超时设置  
            /*从连接池中取连接的超时时间*/  
            ConnManagerParams.setTimeout(params, 1000);  
            /*连接超时*/  
            HttpConnectionParams.setConnectionTimeout(params, 2000);  
            /*请求超时*/  
            HttpConnectionParams.setSoTimeout(params, 4000);  
            //设置HttpClient支持HTTp和HTTPS两种模式  
            SchemeRegistry schReg = new SchemeRegistry();  
            schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));  
            schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
            //使用线程安全的连接管理来创建HttpClient  
            ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);  
            mHttpClient = new DefaultHttpClient(conMgr, params);  
        }  
        return mHttpClient;  
    }  

HttpClient(http://hc.apache.org/httpcomponents-client-ga/)自动管理了cookie信息,
只需要先传递登录信息执行登录过程,然后直接访问想要的页面,跟访问一个普通的页面没有任何区别,
因为HttpClient已经帮忙发送了Cookie信息。下面的例子实现了这样一个访问的过程。

http://xugou4-yahoo-com-cn.iteye.com/blog/1308457
http://blog.csdn.net/yanzi1225627/article/details/24937439

public class RenRen {
// 配置参数
private static String userName = "邮箱地址";
private static String password = "密码";
private static String redirectURL =
"http://blog.renren.com/blog/304317577/449470467"; //要抓取的网址

// 登录URL地址
private static String renRenLoginURL = "http://www.renren.com/PLogin.do";

// 用于取得重定向地址
private HttpResponse response;
// 在一个会话中用到的httpclient对象
private DefaultHttpClient httpclient = new DefaultHttpClient();

//登录到页面
private boolean login() {
//根据登录页面地址初始化httpost对象
HttpPost httpost = new HttpPost(renRenLoginURL);
//POST给网站的所有参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("origURL", redirectURL));
nvps.add(new BasicNameValuePair("domain", "renren.com"));
nvps.add(new BasicNameValuePair("isplogin", "true"));
nvps.add(new BasicNameValuePair("formName", ""));
nvps.add(new BasicNameValuePair("method", ""));
nvps.add(new BasicNameValuePair("submit", "登录"));
nvps.add(new BasicNameValuePair("email", userName));
nvps.add(new BasicNameValuePair("password", password));
try {
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpost.abort();
}
return true;
}

//取得重定向地址
private String getRedirectLocation() {
Header locationHeader = response.getFirstHeader("Location");
if (locationHeader == null) {
return null;
}
return locationHeader.getValue();
}

//根据重定向地址返回内容
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));
}
}
}

public static void main(String[] args) {
RenRen renRen = new RenRen();
renRen.printText();
}
}

httpclient 模拟登录 及线程安全

时间: 2024-09-29 10:18:03

httpclient 模拟登录 及线程安全的相关文章

C# 中使用System.Net.Http.HttpClient 模拟登录博客园 (GET/POST)

一. System.Net.Http.HttpClient简介 System.Net.Http 是微软.net4.5中推出的HTTP 应用程序的编程接口, 微软称之为“现代化的 HTTP 编程接口”, 主要提供如下内容: 1. 用户通过 HTTP 使用现代化的 Web Service 的客户端组件: 2. 能够同时在客户端与服务端同时使用的 HTTP 组件(比如处理 HTTP 标头和消息), 为客户端和服务端提供一致的编程模型. 个人看来是抄袭apache http client ,目前网上用的

使用HttpClient模拟登录人人网+发状态+日志+分享+留言

事先使用HttpAnalyzer对人人网抓包观察,得到相关事件的数据.然后使用HttpClient模拟http请求相关操作.以下代码是今天刚测试过.欢迎新手拿去玩玩.注意:首先要在工程里导入httpclient的包,在apache官网上应该有的下载: http://hc.apache.org/downloads.cgi,目前是4.0+版本:其次记得将主函数里的账号和密码改为自己的,即可完成. import java.io.IOException; import java.io.Unsupport

HttpClient 模拟登录网易微博

      实现核心:代码执行流程,根据抓包工具,模拟浏览器请求步骤走 private static void testLogin() { try { // api.163-->>api.163.login-->>youdao.reg-->>youdao.crossdomain-->>api.163 String callback_url = "http://www.weibss.com"; TBlog tblog = new TBlog

HttpClient 模拟登录搜狐微博

http://mengyang.iteye.com/blog/575671 第一次遇到一个这样的问题,"PKIX path building failed" 异常 详解异常: http://www.cnblogs.com/aurawing/articles/1899217.html 大概意思是,证书出问题了,服务器不信任我们自己创建的证书. 两种解决方法 1.请求时添加代码忽略证书信任问题 我用httpClient,简单明了的两句代码(支持SSL,也就是以https://开头的,一般是

HttpClient 4.1.3 初学篇---使用Get和Post模拟登录简单页面(分别带参数)

最近需要解决的问题需要用到Httpclient,模拟登陆网站!成功之后就可以用代码的方式获取网站内容或者发送请求,类似网络爬虫. 但是在网上找了好多篇Blog,发现每一片的写法都不一样,也纠结了些时间,很纳闷,才发现Httpclient版本不一样...现在在这里说明我使用的版本是HttpClient 4.1.3,我已上传下载 看了些Blog,发现直接访问大型的网站不太容易,于是就自己写了小的站点,只有一个Servlet,来接受参数(用户名和密码)就ok了! 这个Servlet就只有get与pos

android/java模拟登录正方教务系统

最近闲来无事,打算开始写博客,也算是对自己知识的一个总结.本篇将讲解如何使用HttpClient模拟登录正方教务系统. 需要使用道德jar包:HttpClient,Jsoup.(下载jar包) 本次模拟登录的成都大学的教务系统,其他学校的教务系统,可参照本文给出的流程和代码进行修改并测试. 基本流程: 1).使用谷歌浏览器打开教务系统首页,并打开浏览器开发者工具记录浏览过程,然后正常登录并浏览自己的课表,成绩等信息. 2).下载jar包,将jar引用到自己需要的项目中,可创建一个新的工具类. 3

HttpClient + Jsoup模拟登录教务处并获取课表

1.概述 最近想做一个校园助手类的APP,由于第一次做,所以打算先把每个功能单独实现,防止乱了阵脚.利用教务处登录获取课表和成绩等是一个基本功能,所以以获取课表为例实现了这个功能.完整代码点这里,尝试了好几次的,所以写的比较乱. 2.涉及的关键知识 首先,明确获取课表的流程:其实,获取课表就是让手机模拟浏览器,给服务器传去账号.密码,然后服务器会返回cookies(不懂自行百度),利用cookie就可以穿梭自如了,比如查课表.但是,浏览器登录时,返回的html文件浏览器是会自动解析成网页展现在我

Java语言使用HttpClient模拟浏览器登录

使用HttpClient来模拟浏览器登录网站,然后可以进行操作,比如发布信息等 第一步:获取实际的post网址,(不考虑复杂情况下) 1.需要使用到firefox的httpfox插件,httpfox中clear一下,然后start开始捕获 2.切换回网页的登录页面,开始输入自己的账号密码登录,登录成功后切回httpfox中stop,查看最近的post方法中包含的Post Data数据,和此post方法的url网址, 3.这样就得到了模拟登录时需要Post的数据参数(Parameter)和值(Va

Java通过httpclient获取cookie模拟登录

package Step1; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpc