一、准备工作

准备工具:电脑

软件:Fiddler 4(哪个都行,只要抓包)

打开我们学校的教务网站http://202.192.240.29/login!welcome.action

enter image description here

点击验证码框,会向服务器发送get请求,这是我抓到的请求内容

enter image description here

服务器返回的是一个验证码

enter image description here

当我输入验证码,然后点击登录,这是我抓到的包

enter image description here

这里可以看到请求的内容是account=311500xxxx&pwd=xxxxxx&verifycode=84ga

这里不用多讲吧,account是学号,pwd当然是password啦,verifycode肯定是验证码啦。

当我们登录成功,服务器回返回一个json数据,成功的code是0,message是“登录成功”,如果错误的话,code是-1,message会提示你错误的方式。

然后我们点击成绩查询。

enter image description here

这是我抓到的数据,这里服务器同样返回的是json数据,这很有利于我们的解析。

   到这里,我们的前期准备工作已经完成,下一步,干嘛呢?

二、主要思路

这里我开始介绍,我的主要思路。当然这里需要你对http协议有那么一点的认识,强烈推荐一本快速入门的书《图解http》。

   我们可以看到,我每次发送post请求或者get请求时都会有这么一个东西Cookie:JSESSIONID=BCA9EDDA29865D38E7D7344D975D78A6,这是啥东西呢?因为http协议是无状态的,那么我们要怎么确认当前用户就是刚刚登陆的用户呢?所以这里就有了JSESSIONID,要是不明白,请百度(JSESSIONID),然后你看看应该就会明白了,这里假设你已经明白了。

这个JSESSIONID是当我们第一次打开教务网站的时候,服务器给我们分配的。有图有真相,看图。

enter image description here

  这里的Set-Cookie: JSESSIONID=428F8358B38BB1C1B9B344E5D1D79DA2;Path=/; HttpOnly,我们主要关心这个JSESSIONID=428F8358B38BB1C1B9B344E5D1D79DA2(这里为啥跟上面不一样呢,因为我重新打开了浏览器,系统又重新给我分配的),这里的set-cookie就给我们设置了JSESSIONID,这里就是我们当前登录的唯一标识,所以我们每次发送请求的时候都要带上它。

三、具体实现(Java实现)

   class myVerifyThread extends Thread{

    @Override

    public void run() {

        try {

            HttpClient httpClient = newDefaultHttpClient();

            HttpGet httpGet = new HttpGet(“http://202.192.240.29/yzm?d=1515824347343”);

           httpGet.setHeader("Accept","*/*");

           httpGet.setHeader("Connection","keep-alive");

           httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132Safari/537.36");

            HttpResponse httpResponse =httpClient.execute(httpGet);

            if(httpResponse.getStatusLine().getStatusCode() == 200) {

                SaveCookies(httpResponse);//保存获得的JSESSIONID

                // 请求和响应都成功了

                byte[] bytes;

                bytes =EntityUtils.toByteArray(httpResponse.getEntity());

                Message message=new Message();

                Bundle bundle=new Bundle();

               bundle.putByteArray("verify",bytes);

                message.setData(bundle);

                message.what=1001;

               handle.sendMessage(message);//获取验证码

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

这里是想服务器发送get请求,也就是获得验证码。

这里把获得验证码发送出去。

enter image description here

这里把验证码显示出来。

下面这个函数是保存从服务那边获得的JSESSIONID。

enter image description here

然后我们实现登录功能。

enter image description here

这里我们再把JSESSIONID给添加到请求头那里去,这样我们就完美欺骗了服务器,我就是刚刚第一访问你的那个我。(其他的头可以根据抓包那里的头来设置)

enter image description here

这里解析服务器返回我们的json数据。

enter image description here

到这里大家应该都懂了吧。

具体思路就是给服务器发送http请求,然后保存服务器返回的JSESSIONID,然后我们访问的时候都要把JSESSIONID添加到post请求头那里,这样我们就可以访问了。

这是效果图。

enter image description here enter image description here