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 }
