最近在做一个APP,需要模拟登录教务处,之前曾经用HttpClient做过,点这里,但是发现最新的Android SDK已经不支持Httpclient了,所以只好在琢磨一下HttpURLConnection实现了,其中一个问题浪费了不少时间,下面这行代码一旦添加就无法登录:

httpURLConnection.setRequestProperty("Content-Type","text/html; charset=GBK");

  贴一下效果,由于是实现模拟登录,就没有解析,主要是能用Cookie访问到。

  此外,有一个重要发现,用电脑和手机对应的Cookie都能登录,说明服务器可以对应多个Cookie!

  真是一路磕磕绊绊!

  贴下主要代码:

  1.结构

  

  2.MainActivity

package io.github.zhaoyu1995.uprtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
private TextView kebiao;
private MyTasks task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
kebiao = (TextView) findViewById(R.id.kebiao);
task = new MyTasks("201445004", "******", new OnFinishTask() {
@Override
public void onFinish(String data) {
kebiao.setText(data);
}
});
task.execute();
} }

  3.MyTask

package io.github.zhaoyu1995.uprtest;

import android.os.AsyncTask;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map; public class MyTasks extends AsyncTask<Void, Void, String> {
private OnFinishTask onFinishTask;
private String user;
private String pass;
private String result; private List<String> finalCookie = new ArrayList<String>();
private String jiaowuchu = "http://zhjw.dlut.edu.cn/loginAction.do";
public MyTasks (String user, String pass, OnFinishTask onFinishTask) {
this.user = user;
this.pass = pass; this.onFinishTask = onFinishTask;
} @Override
protected String doInBackground(Void... voids) {
URL url;
HttpURLConnection httpURLConnection; try {
url = new URL(jiaowuchu);
httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setDoOutput(true);//是否向链接输出
httpURLConnection.setDoInput(true); httpURLConnection.setRequestMethod("POST"); httpURLConnection.setUseCaches(false);
httpURLConnection.setInstanceFollowRedirects(true); //不知道为什么加了这一行就不行了
httpURLConnection.setRequestProperty("Content-Type","text/html; charset=GBK");
httpURLConnection.setConnectTimeout(10*1000);//连接超时 单位毫秒
httpURLConnection.setReadTimeout(10*1000);//读取超时 单位毫秒 // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
// 要注意的是connection.getOutputStream会隐含的进行connect。
httpURLConnection.connect();
DataOutputStream out = new DataOutputStream(httpURLConnection
.getOutputStream()); StringBuffer params = new StringBuffer();
params.append("zjh").append("=").append(user).append("&")
.append("mm").append("=").append(pass);
httpURLConnection.getOutputStream().write(params.toString().getBytes("gb2312"));
out.flush();
out.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpURLConnection.getInputStream(), "gb2312"));
String line;
while ((line = reader.readLine()) != null) {
result = result + line;
}
reader.close(); result="";
Map<String, List<String>> header = httpURLConnection.getHeaderFields();
List<String> cookies = header.get("Set-Cookie");
Iterator<String> it = cookies.iterator();
StringBuffer sbu = new StringBuffer();
// sbu.append("eos_style_cookie=default; ");
while(it.hasNext()){
sbu.append(it.next());
} result = cookies.size()+""; for (int i = 0; i < cookies.size(); i++) {
finalCookie.add(cookies.get(i));
} result = result+finalCookie.get(0);
result = result+"--------------"+finalCookie.get(1); httpURLConnection.disconnect(); } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} //get课表 try {
url = new URL("http://zhjw.dlut.edu.cn/xkAction.do?actionType=6");
httpURLConnection = (HttpURLConnection) url.openConnection();
//必要的设置
httpURLConnection.setConnectTimeout(10*1000);//连接超时 单位毫秒
httpURLConnection.setReadTimeout(10*1000);//读取超时 单位毫秒
httpURLConnection.setRequestProperty("Cookie", finalCookie.get(0)+", "+finalCookie.get(1));
System.out.println(finalCookie.get(0)+", "+finalCookie.get(1));
// httpURLConnection.setRequestProperty("Cookie", "JSESSIONID=nprNP171vDeCHb_5hawDv; path=/, NSC_kjbpxv-iuuq=2385a3d4705debd5f29101f47dcbd3b0e664f181853b4741569229a0561453d027e6fa67;path=/");
httpURLConnection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "gb2312"));
String lines;
//result = "";
while ((lines = reader.readLine()) != null) {
result = result + lines;
}
reader.close();
// 断开连接
result = result + httpURLConnection.getResponseCode();
httpURLConnection.disconnect(); } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return result;
} @Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
onFinishTask.onFinish(s);
}
}

  4.OnFinishTask

package io.github.zhaoyu1995.uprtest;

public interface OnFinishTask {
public void onFinish(String data);
}

Android利用HttpURLConnection实现模拟登录的更多相关文章

  1. 利用jsoup进行模拟登录

    因为工作的原因,近段时间开始接触jsoup.大概也弄清了用java来爬网页是怎样一个过程.特此,写篇日志以便他日方便查看. Jsoup是一个java平台的能够对xml文档结构的文档进行解析.有点类似于 ...

  2. Android(Java) 模拟登录知乎并抓取用户信息

    前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ...

  3. 2020.10.20 利用POST请求模拟登录知乎

    前两天学习了Python的requests模块的相关内容,对于用GET和PSOT请求访问网页以抓取需要的内容有了初步的了解,想要再从一些复杂的网站积累些经验.最开始我采用最简单的get(url)方法想 ...

  4. urllib库利用cookie实现模拟登录慕课网

    思路 1.首先在网页中使用账户和密码名登录慕课网 2.其次再分析请求头,如下图所示,获取到请求URL,并提取出cookie信息,保存到本地 3.最后在代码中构造请求头,使用urllib.request ...

  5. 利用POST请求模拟登录豆瓣

    需要用requests库 豆瓣上次更新后,就不能通过直接的requests.post()方式直接传递参数登录了.必须新建session,先GET请求,然后POST才能成功.原因未知 data参数中的四 ...

  6. 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...

  7. scrapy模拟登录微博

    http://blog.csdn.net/pipisorry/article/details/47008981 这篇文章是介绍使用scrapy模拟登录微博,并爬取微博相关内容.关于登录流程为嘛如此设置 ...

  8. 《转载》python爬虫实践之模拟登录

    有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录.   浏览器访问服务器的过程   在用户访问网页时,不论是通过URL输入域名或IP ...

  9. [PHP自动化-进阶]001.CURL模拟登录并采集数据

    引言:PHP可以通过libcurl实现模拟登录,提交数据,违法乱纪,烧杀抢虐等等事项. 简单说明一下"libcurl",补一下脑: libcurl目前支持http.https.ft ...

随机推荐

  1. Play Framework 完整实现一个APP(五)

    程序以及基本可用了,需要继续完善页面 1.创建页面模板 创建文件 app/views/tags/display.html *{ Display a post in one of these modes ...

  2. ORACLE应用调优:请避免SQL做大量循环逻辑处理

    前阵子遇到一个案例:一个同事说以前一个运行很正常的包,突然间比以前慢了很多,执行时间非常长,晚上的作业调用这个包跑了几个小时也没有跑出数据.于是我在跟踪.优化过程中定位到包中一个存储过程的一段SQL, ...

  3. Ant :Property

     Property Ant 内置的Property 系统属性 Ant附加的属性 自定义Property Ant :Property properties是由key-value组成的集合,就是Java中 ...

  4. 《CLR via C#》---枚举标志和标志位

    枚举类型 枚举类型定义了一组符号名称/值配对. 如 private enum Color /* : byte */ { White, // Assigned a value of 0 Red, // ...

  5. 基于Ajax+div的“左边菜单、右边内容”页面效果实现

    效果演示: ①默认页面(index.jsp): ②:点击左侧 用户管理 标签下的 用户列表 选项后,右边默认页面内容更新为用户列表页(userList.jsp)的内容 : ③:同理,点击 产品管理.订 ...

  6. markdown简要说明源码

    ##markdown ###什么是markdown:    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.  Markdown具有 ...

  7. 追MM的各种算法

    原文:http://blog.sae.sina.com.cn/archives/3542#more-3542 看到一篇文章把算法描述的相当的好,先收藏了! 动态规划 基本上就是说:你追一个MM的时候, ...

  8. php使用$_SERVER["REMOTE_ADDR"]获取访问IP地址

    print "您的IP地址是:"; if(!empty($_SERVER["HTTP_CLIENT_IP"])){  $cip = $_SERVER[" ...

  9. 帆软报表FineReport中数据连接之Weblogic配置JNDI连接

    1. 制作报表的原理 在帆软报表FineReport设计器中先用JDBC连接到数据库,建立数据库连接,然后用SQL或者其他方法创建数据集,使用数据集制作报表,然后把建立的数据库连接从JDBC连接改成J ...

  10. BZOJ 3524: [Poi2014]Couriers [主席树]

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1892  Solved: 683[Submit][St ...