您的位置:首页 > 理论基础 > 计算机网络

HttpClient模拟浏览器登录后发起请求(携带Cookie发请求)以及网页显示的事件过程

2015-07-19 21:30 597 查看
浏览器的工作:

[code]  1请求一个需要登录的页面或资源
  2服务器判断当前的会话是否包含已登录信息。如果没有登录重定向到登录页面
  3手工在登录页面录入正确的账户信息并提交
  4服务器判断登录信息是否正确,如果正确则将登录成功信息保存到session中
  5登录成功后服务器端给浏览器返回会话的SessionID信息保存到客户端的Cookie中
  6浏览器自动跳转到之前的请求地址并携带之前的Cookie(包含登录成功的SessionID)
  7服务器端判断session中是否有成功登录信息,如果有则将请求的资源反馈给浏览器


出现再屏幕上的每个网页所发生的事件:

[code]    1.直接在浏览器上输入一个URL,也可以单击页面上的某个链接来获取一个网页,URL包含获取互联网上目标文件所需的一切信息.
    2.自己的浏览器向以URL命名的服务器发送一个HTTP请求,以获取某个特定的文件.如果URL指定的是一个目录(而不是一个文件),就是在请求获取目录中的默认文件.
    3.服务器寻找被请求的文件,并发送一个HTTP的反馈
       a>如果找不到页面,服务器就会返回错误消息,这些消息通常是"404 Not Found",当然还有很多其他的错误消息.
       b>如果找到文件,服务器就会取得请求的文件,并且把它返回给浏览器.
    4.浏览器解析HTML文件,如果页面包含图片,(使用HTML的img元素)或者其他外部的紫原如脚本,浏览器就会与服务器再次通信,以获取标记指定的图片.
    5.浏览器在每个img元素指定位置插入图片,然后整个网页就整合好了.


这是最近写的一个模拟登录微博手机版的小程序

[code]package loginweibo;

import com.sun.xml.internal.bind.v2.runtime.reflect.opt.Const;
import org.apache.http.Consts;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.CookieSpecs;
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.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import sun.rmi.runtime.Log;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by pl on 15-7-19.
 */
public class weibo {
    public static void main(String[] args) throws NullPointerException{

        //登录页面的URL
        String Loginurl ="http://login.weibo.cn/login/";
        String firstpage = "http://weibo.cn/?vt=4";    //微博首页的网址
        String loginnum = "18829289882";
        String loginpwd = "pl19710504";

        CloseableHttpClient httpclient = HttpClients.createDefault();   //建立客户端的链接
        HttpGet httpget = new HttpGet(Loginurl);

        try{
            CloseableHttpResponse response = httpclient.execute(httpget);

            String responhtml = null;
            try {
                responhtml = EntityUtils.toString(response.getEntity());
                //System.out.println(responhtml);
            } catch (IOException e1) {
                e1.printStackTrace();
            }

                 //将vk的值截出来,split将整个的html分为两个部分,截取下面的部分
                String vk = responhtml.split("<input type=\"hidden\" name=\"vk\" value=\"")[1].split("\" /><input")[0];
                System.out.println(vk);

                String pass = vk.split("_")[0];
                String finalpass = "password_"+pass;
                System.out.println(finalpass);
                response.close();

                List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>();
                pairs.add(new BasicNameValuePair("mobile",loginnum));
                pairs.add(new BasicNameValuePair(finalpass,"pl19710504"));
                pairs.add(new BasicNameValuePair("remember","on"));
                pairs.add(new BasicNameValuePair("vk",vk));

                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs, Consts.UTF_8);   //返回的实体
                HttpPost httppost = new HttpPost(Loginurl);
                httppost.setEntity(entity);
                //检测以下响应状态是否正确
                CloseableHttpResponse  response2 = httpclient.execute(httppost);
                System.out.println(response2.getStatusLine().toString());
                httpclient.execute(httppost);  //登录操作
                System.out.println("success");

                HttpGet getinfo= new HttpGet("http://m.weibo.cn/p/100803?vt=4");
                CloseableHttpResponse res;
                res = httpclient.execute(getinfo);
                System.out.println("进入热门话题的页面:");
                //输出该页面的html文件
                System.out.println(EntityUtils.toString(res.getEntity()));
                res.close();

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            try {
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: