浏览器的工作:
1请求一个需要登录的页面或资源
2服务器判断当前的会话是否包含已登录信息。如果没有登录重定向到登录页面
3手工在登录页面录入正确的账户信息并提交
4服务器判断登录信息是否正确,如果正确则将登录成功信息保存到session中
5登录成功后服务器端给浏览器返回会话的SessionID信息保存到客户端的Cookie中
6浏览器自动跳转到之前的请求地址并携带之前的Cookie(包含登录成功的SessionID)
7服务器端判断session中是否有成功登录信息,如果有则将请求的资源反馈给浏览器
出现再屏幕上的每个网页所发生的事件:
1.直接在浏览器上输入一个URL,也可以单击页面上的某个链接来获取一个网页,URL包含获取互联网上目标文件所需的一切信息.
2.自己的浏览器向以URL命名的服务器发送一个HTTP请求,以获取某个特定的文件.如果URL指定的是一个目录(而不是一个文件),就是在请求获取目录中的默认文件.
3.服务器寻找被请求的文件,并发送一个HTTP的反馈
a>如果找不到页面,服务器就会返回错误消息,这些消息通常是"404 Not Found",当然还有很多其他的错误消息.
b>如果找到文件,服务器就会取得请求的文件,并且把它返回给浏览器.
4.浏览器解析HTML文件,如果页面包含图片,(使用HTML的img元素)或者其他外部的紫原如脚本,浏览器就会与服务器再次通信,以获取标记指定的图片.
5.浏览器在每个img元素指定位置插入图片,然后整个网页就整合好了.
这是最近写的一个模拟登录微博手机版的小程序
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();
}
}
}
}