`
michaeltangbin
  • 浏览: 271718 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江省
社区版块
存档分类
最新评论

使用HttpClient模拟网站登陆sina邮箱(保持远程服务器session和cookie)

    博客分类:
  • java
阅读更多

使用HttpClient模拟网站登陆sina邮箱(保持远程服务器session和cookie) (转载)

http://www.cnblogs.com/yesun/archive/2007/09/23/903319.html

/**
     * 通过URL取得网页内容
     */
    private void HttpRequestURL()
    {
        String postData = "";
        if(_tc.getPostData()!=null && !_tc.getPostData().equals(""))
        {
            postData = _tc.getPostData();
        }
        if(_tc.getPostMethod()==null || _tc.getPostMethod().equals(""))
            _tc.setPostMethod("GET");
        String postUrl = _tc.getUrl();
        if(_tc.getPostMethod().toUpperCase().equals("GET") && !postData.equals(""))
        {
            if(postUrl.indexOf("?") > -1)
                postUrl += "&"+postData;
            else
                postUrl += "?"+postData;                   
        }
        System.out.println("--------Transfer Start------------------------------------------------------------------");
        System.out.println(" 页面解析准备就绪...");
        System.out.println(" Url:"+postUrl);
        System.out.println(" PostData:"+postData);
        System.out.println(" PostMethod:"+_tc.getPostMethod());
        System.out.println(" Encoding:"+_tc.getEncoding());
        System.out.println("--------------------------------------------------------------------------------------");
           
       
        HttpClient httpClient = new HttpClient();
       
        if(_tc.getPostMethod().toUpperCase().equals("GET"))
        {
            if(!postData.equals(""))
            {
                if(postUrl.indexOf("?") > -1)
                    postUrl += "&"+postData;
                else
                    postUrl += "?"+postData;
            }
           
            GetMethod getHC = new GetMethod(postUrl);
            getHC.setFollowRedirects(false);
           
            getHC.getParams().setHttpElementCharset("UTF-8");
           
            //发送Cookie
            StringBuilder cookieValue = new StringBuilder();
            for(String key : this.cookie.keySet()){
                cookieValue.append(key);
                cookieValue.append("=");
                cookieValue.append(this.cookie.get(key));
                cookieValue.append("; ");
            }
            getHC.setRequestHeader("Cookie", cookieValue.toString());
            getHC.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
           
            int statusCode;
            try {
                statusCode = httpClient.executeMethod(getHC);
               
                Header[] headers = getHC.getResponseHeaders();
                for(Header header : headers){
                    if(header.getElements().length > 1){
                        HeaderElement[] elements = header.getElements();
                        for(HeaderElement element : elements){
                            checkCookie(element);
                        }
                    }
                    else
                    {
                        checkCookie(header);
                    }
                }
               
                if(statusCode==HttpStatus.SC_OK){
                   
                    String charset = "utf-8";
                    if(_tc.getEncoding() == GB2312)
                        charset = "gb2312";
                    else if(_tc.getEncoding() == UTF8)
                        charset = "utf-8";
                    else if(_tc.getEncoding() == BIG5)
                        charset = "big5";
                    else
                        charset = "utf-8";
                   
                    System.out.println("charset : " + charset);
                   
                    InputStreamReader isr = new InputStreamReader(getHC.getResponseBodyAsStream(), charset); // 设置读取流的编码格式,自定义编码           
                    // 使用字符读取方式,循环读取源文件内容       
                    StringBuffer sb = new StringBuffer();
                    int b ;
                    while ((b = isr.read()) != -1)//顺序读取文件text里的内容并赋值给整型变量b,直到文件结束为止。
                    {
                        if (b < 32 && b!= 10 && b != 13 && b != 9) b = 32;//过滤掉一些换行等符号
                        //if ( b== 10 || b== 13 || b== 9) b = 32;//过滤掉一些换行等符号
                        sb.append((char)b);
                    }
                    isr.close();
                    getHC.abort();
                    //取得采集的内容
                    _content  = sb.toString();
                    //System.out.println("content : "+_content);
                   
                }
                else
                {
                    if(statusCode == 301 || statusCode == 302){                       
                        Header locationHeader = getHC.getResponseHeader("location");
                        _tc.setUrl(locationHeader.getValue());
                        _tc.setPostData("");
                        _tc.setPostMethod("GET");
                        HttpRequestURL();//重新请求新网页
                       
                    }
                   
                }
               
               
            } catch (HttpException e2) {
                e2.printStackTrace();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
        else
        {
            PostMethod postHC = new PostMethod(postUrl);
            postHC.setFollowRedirects(false);
            postHC.getParams().setHttpElementCharset("UTF-8");
           
            //发送Cookie
            StringBuilder cookieValue = new StringBuilder();
            for(String key : this.cookie.keySet()){
                cookieValue.append(key);
                cookieValue.append("=");
                cookieValue.append(this.cookie.get(key));
                cookieValue.append("; ");
            }
            postHC.setRequestHeader("Cookie", cookieValue.toString());
            postHC.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
           
            //post数据到服务器
            if(postData!=null && !postData.equals("")){
               
                HashMap<String,String> argv =  new HashMap<String,String>();
                String[] arrParams = postData.split("&");
                for(int i=0;i<arrParams.length;i++){
                    if(arrParams[i] == null || arrParams[i].equals(""))
                    {
                        continue;
                    }
                    else if(arrParams[i].indexOf("=") > -1)
                    {
                        String[] nameValue = arrParams[i].split("=");
                        if(nameValue.length > 1)
                            argv.put(nameValue[0], nameValue[1]);
                    }
                }
               
                if(argv!=null){
                    NameValuePair[] nameValuePair = new NameValuePair[argv.size()];
                   
                    int i = 0;
                    for(String key : argv.keySet()){
                        nameValuePair[i] = new NameValuePair(key, argv.get(key));
                        i++;
                    }
                    postHC.setRequestBody(nameValuePair);
                }
            }
           
            int statusCode;
            try {
                statusCode = httpClient.executeMethod(postHC);
               
                Header[] headers = postHC.getResponseHeaders();
                for(Header header : headers){
                    if(header.getElements().length > 1){
                        HeaderElement[] elements = header.getElements();
                        for(HeaderElement element : elements){
                            checkCookie(element);
                        }
                    }
                    else
                    {
                        checkCookie(header);
                    }
                }
               
                if(statusCode==HttpStatus.SC_OK){
                   
                    String charset = "utf-8";
                    if(_tc.getEncoding() == GB2312)
                        charset = "gb2312";
                    else if(_tc.getEncoding() == UTF8)
                        charset = "utf-8";
                    else if(_tc.getEncoding() == BIG5)
                        charset = "big5";
                    else
                        charset = "utf-8";
                                      
                    InputStreamReader isr = new InputStreamReader(postHC.getResponseBodyAsStream(), charset); // 设置读取流的编码格式,自定义编码           
                    // 使用字符读取方式,循环读取源文件内容       
                    StringBuffer sb = new StringBuffer();
                    int b ;
                    while ((b = isr.read()) != -1)//顺序读取文件text里的内容并赋值给整型变量b,直到文件结束为止。
                    {
                        if (b < 32 && b!= 10 && b != 13 && b != 9) b = 32;//过滤掉一些换行等符号
                        //if ( b== 10 || b== 13 || b== 9) b = 32;//过滤掉一些换行等符号
                        sb.append((char)b);
                    }
                    isr.close();
                    postHC.abort();
                    //取得采集的内容
                    _content  = sb.toString();
                   
                }
                else
                {
                    if(statusCode == 301 || statusCode == 302){
                        Header locationHeader = postHC.getResponseHeader("location");
                        _tc.setUrl(locationHeader.getValue());
                        _tc.setPostData("");
                        _tc.setPostMethod("GET");
                        HttpRequestURL();//重新请求新网页
                    }
                   
                }
               
               
            } catch (HttpException e2) {
                e2.printStackTrace();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
    }

private void checkCookie(NameValuePair entry){
        if(entry.getName().equals("Set-Cookie")){
            //这个就是Cookie了
            String value = entry.getValue();
            if(value.indexOf(";") >0 )
                value = value.substring(0,value.indexOf(";"));
           
            System.out.println(entry.toString());
           
            String[] cookieNameValuePair = value.split("=");
            if(cookieNameValuePair.length > 1){
                if(cookieNameValuePair[1].equals("deleted")){
                    this.cookie.remove(cookieNameValuePair[0]);
                }
                else
                {
                    this.cookie.put(cookieNameValuePair[0], cookieNameValuePair[1]);
                }
            }
            else
            {
                this.cookie.remove(cookieNameValuePair[0]);
            }
        }
    }

分享到:
评论

相关推荐

    Java 使用HttpClient保持SESSION状态

    为了保持SESSION状态,我们需要处理服务器返回的Cookie,并在后续请求中发送回去。以下是一个基本步骤: 1. **创建HttpClient实例**:首先,创建一个HttpClient实例,可以使用`HttpClients.createDefault()`或者...

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

    本文将详细讲解如何使用HTTPClient来保持session会话,从而实现模拟登录后的其他操作。 首先,理解session的概念至关重要。Session是服务器端用来跟踪用户状态的一种机制。在Web应用中,当用户登录后,服务器会为该...

    java httpclient 模拟登录

    在"java httpclient 模拟登录"这个场景下,我们通常会用到HttpClient来模拟用户登录网站的过程,获取登录后的session信息,以便后续能够访问登录后才能看到的页面内容。以下将详细介绍如何使用Java HttpClient进行...

    httpUtil httpclient 登陆携带cookie访问下一个连接

    在这个场景中,我们关注的是如何使用`httpclient`进行模拟登录并携带cookie来访问后续的URL。这个过程通常涉及到处理session和身份验证,对于开发需要登录功能的Web应用或自动化测试脚本尤其有用。 首先,`...

    新浪,腾讯微博HttpClient4模拟登陆

    本文将深入探讨如何使用Java中的HttpClient4库来实现对新浪和腾讯微博的模拟登录。HttpClient4是一个强大的HTTP客户端库,它允许开发者执行HTTP请求并处理响应,非常适合进行网页交互。 首先,我们来看`Sina.java`...

    httpclient4之百度模拟登陆,回复与58同城自动登陆

    本主题将深入探讨如何使用HttpClient4库进行百度和58同城的模拟登陆操作。HttpClient4是一个强大的Java库,它提供了丰富的功能来执行HTTP请求,非常适合进行网页交互。 首先,我们来了解HttpClient4的基本用法。...

    httpclient模拟登录实例

    在实际应用中,模拟登录可能涉及到更复杂的情况,如验证码处理、保持登录状态(通过Cookie或Session)、处理重定向等。HttpClient提供了丰富的接口和策略类,使得这些操作变得相对简单。 通过阅读和理解HttpClient...

    HttpClient模拟登录实例

    在本实例中,我们将探讨如何使用HttpClient库来模拟登录网站,获取用户信息,以及处理带有验证码的登录场景。 首先,我们需要理解HttpClient的基本使用。HttpClient的核心类包括HttpClient本身,HttpGet、HttpPost...

    java模拟淘宝登录源码

    登录成功后,服务器会返回一些关键的标识,如Session ID或Cookie,这些标识用于后续的会话保持。 三、HTTP请求构造 使用HTTPClient构建登录请求时,需要创建`HttpPost`对象,设置目标URL为淘宝的登录接口。然后,...

    Jsoup+httpclient模拟登陆和抓取页面.pdf

    Jsoup+httpclient模拟登陆和抓取页面.pdf

    HttpClient模拟登陆方正系统

    1. 保持会话:登录成功后,服务器通常会返回一个session cookie。在后续的请求中,我们需要把这个cookie添加到请求头中,以保持会话: ```java Header[] cookies = response.getAllHeaders(); for (Header cookie...

    C# 使用HttpClient模拟请求的案例

    字符集使用UTF-8编码,数据通讯统一采用 HTTP 协议通讯,使用POST 方法请求并传递参数。 POST请求Content-Type 设置为application/x-www-form-urlencoded 除此之外,我们对请求添加签名的校验,key设置为X-Sign 接口...

    HttpClient模拟登陆

    在阅读博文《HttpClient模拟登陆》时,可以深入学习如何解决这些具体问题,并查看示例代码以获得更详细的实现细节。 标签“源码”意味着你需要关注底层的工作原理,而“工具”标签则暗示HttpClient作为一个实用工具...

    Jsoup+httpclient 模拟登陆和抓取

    - 在Java程序中使用Jsoup和HttpClient来模拟登录一个网站并抓取页面内容。 - 案例中包含了登录、页面访问、内容抽取、页面修改和保存到本地等步骤,展示了完整的操作流程。 9. HTTP请求参数设置: - 设置HTTP...

    httpclient模拟登陆

    ### HTTPClient 模拟登录详解 #### 一、概述 HTTPClient是Apache组织下的一个开源项目,它提供了功能丰富的HTTP客户端开发工具包,可以用来发送HTTP请求并接收响应。利用HTTPClient,我们可以轻松实现模拟登录的...

    使用httpclient模拟表单提交

    本篇文章将深入探讨如何使用HttpClient来模拟表单提交。 表单提交通常是用户在网页上填写信息后点击提交按钮,数据通过HTTP请求发送到服务器的过程。HttpClient为我们提供了模拟这一过程的能力,无论是GET还是POST...

    HttpClient 登录163邮箱

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

    使用HttpClient登录网易邮箱

    要使用HttpClient登录网易邮箱,我们首先要了解网易邮箱的登录接口和所需的数据格式。通常,登录接口会需要用户提供用户名(通常是邮箱地址)和密码。在HTTP POST请求中,这些数据会被封装在请求体里,以键值对的...

    httpclient 模拟登陆代码和jar包

    以下是一份使用`HttpClient`进行模拟登录的典型步骤和相关知识点: 1. **导入依赖**:首先,你需要在项目中引入`HttpClient`的相关jar包。这些jar包可能包括`httpclient`, `httpcore`, `httpmime`等,它们提供了...

Global site tag (gtag.js) - Google Analytics