NEU校园网登录器
http://www.cnblogs.com/weidiao/p/5124106.html
改自学长的博客。
我们的目标是写一个程序实现自动登录校园网。而这基于的是表单的post机制。
输入校园网网址:tree.neu.edu.cn,弹出界面如下:
观察到进入该界面后网址变为“http://tree.neu.edu.cn:804/srun_portal_pc.php?ac_id=1&url=”,804是端口,“srun_portal_pc.php”是其下的一个子文件,?后面的“ac_id=1&url=”是参数信息,其中&是分隔符。
我们要做的就是用java实现输入用户名、密码并依次点击断开全部链接、连接网络四个操作步骤。具体实现,就是向一个URL发送请求信息。
查看网页源代码,表单部分代码如下,当用户单击确认按钮时,表单的内容会被传送到另一个文件。表单的action定义了目的文件的文件名。由其定义的这个文件通常会对接收到的输入数据进行相关的处理。
观察到连接网络、断开网络、断开全部连接这三个选项,其中只有连接网络是submit,另两个是button按钮,按下后激发do_logout()函数,另两个按钮效果无区别,学校本来想设计的是单账号多处登录,但实际是单端口单登录,多登录并未实现。
当我们点击断开网络的时候,激发“do_logout()”函数。
在当前页面下按F12,弹出控制台,我们就能看到do_logout()函数的具体实现了。
函数使用jQuery的$.post方法以POST形式向服务器发起AJAX请求。
$.post(url,parameters,callback) |
|
参数 |
|
url |
(字符串)服务器端资源地址。 |
parameter |
(对象)需要传递到服务器端的参数。 参数形式为“键/值”。 |
callback |
(函数)在请求完成时被调用。该函数参数依次为响应体和状态。 |
返回值 |
XHR实例 |
点击后,传递的参数有action,username,password及ajax。
因此,我们需要向服务器端资源地址传递以上信息。
post(host+"include/auth_action.php", data+"&action=logout&ajax=1");
再来看看登录的实现。
刚才说过只有连接网络是submit。为什么只有这个是submit呢?因为假如三个按钮都是提交按钮,那服务器就无法区别了。
host: xxxxxxx
User-Agent: xxxxxx
Cookie: xxxxxx
username=xxxx&password=xxxx
check2()里有这样的代码:
1 import java.io.BufferedReader; 2 import java.io.DataOutputStream; 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.net.HttpURLConnection; 6 import java.net.URL; 7 import java.net.URLEncoder; 8 9 public class Main { 10 public static void main(String[] args) throws IOException { 11 String host = "http://tree.neu.edu.cn:803/"; 12 String username = "???", password = "???"; 13 String data = "username="+username+"&password="+password; 14 post(host+"include/auth_action.php", data+"&action=logout&ajax=1"); 15 post(host+"srun_portal_pc.php", data+"&action=login&ac_id=1"); 16 //post(host+"srun_portal_pc.php?ac_id=1&url=", data+"&action=login"); 17 } 18 19 static void post(String url, String data) throws IOException{ 20 URL postUrl = new URL(url); 21 HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection(); 22 connection.setDoOutput(true); 23 connection.setDoInput(true); 24 25 DataOutputStream out = new DataOutputStream(connection 26 .getOutputStream()); 27 out.writeBytes(data); 28 29 /////////////////////////////分割线///////////////////// 30 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
31 String line; 32 while ((line = reader.readLine()) != null){ 33 System.out.println(line); 34 } 35 36 reader.close(); 37 connection.disconnect(); 38 } 39 }