HttpURLConnection模拟登录学校的正方教务系统
教务系统登录界面
如图1-1
1-1
F12--》network查看登录教务系统需要参数:
__VIEWSTAT
txtUserName
TextBox2
txtSecretCode
RadioButtonList1
Button1
lbLanguage
hidPdrs
hidsc
如图1-2
1-2
或者登录之前开启wireshark也可捕获到登录系统时post的数据,使用"http.request.method==POST"过滤条件进行筛选
如图1-3
1-3
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* Copyright (c) 2015
* technology co., LTD)
* All rights reserved.
*/
/**
* Description :
* <p/>
* <br><br>Time : 2015-11-10 上午11:13:13
*
* @author ZXL
* @version 1.0
* @since 1.0
*/
public class TeachingAffaiSystemLogin {
//验证码url
//static String surl = "http://jwc.gduf.edu.cn/CheckCode.aspx";
private static String main_url = "http://jwc.gduf.edu.cn/default2.aspx";
private static String forword_url = "http://jwc.gduf.edu.cn/xs_main.aspx?xh=";
private static String responseCookie = "";
private static String __VIEWSTATE = "";
private static String txtUserName = "教务系统账号";
private static String TextBox2 = "教务系统密码";
private static String txtSecretCode = "";
private static String RadioButtonList1 = "学生";
private static String Button1 = "";
private static String lbLanguage = "";
private static String hidPdrs = "";
private static String hidsc = "";
private static URL url;
private static HttpURLConnection httpURLConn;
private static String imageName = "code";
public static void main(String[] args) {
// TODO Auto-generated method stub
doGet();
doPost();
}
/**
* GET参数 __VIEWSTATE
* @param args
*/
private static void doGet(){
try {
//保存验证码图片
url = new URL(main_url);
httpURLConn = (HttpURLConnection)url.openConnection();
httpURLConn.setDoInput(true);
httpURLConn.setDoOutput(true);
//拿到服务器随机生成的__VIEWSTATE
String line = null;
BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConn.getInputStream(),"GB2312"));
String regEx = "<input.*type=\"hidden\".*name=\"__VIEWSTATE\".*value=\"(.*)\".*/>";
while ((line = br.readLine())!=null){
Pattern pat = Pattern.compile(regEx);
Matcher mat = pat.matcher(line);
boolean rs = mat.find();
if (rs==true){
System.out.println(mat.groupCount());
for(int i=1;i<=mat.groupCount();i++){
System.out.println(mat.group(i));
}
__VIEWSTATE = mat.group(1);
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* post参数登录到教务系统
* @param args
*/
private static void doPost(){
//post数据登录
try {
url = new URL(main_url);
httpURLConn = (HttpURLConnection)url.openConnection();
httpURLConn.setDoInput(true);
httpURLConn.setDoOutput(true);
httpURLConn.setRequestProperty("contentType", "GB2312");
StringBuilder sb = new StringBuilder();
sb.append("__VIEWSTATE=" +URLEncoder.encode(__VIEWSTATE, "GB2312"));
sb.append("&txtUserName="+URLEncoder.encode(txtUserName, "GB2312"));
sb.append("&TextBox2="+URLEncoder.encode(TextBox2, "GB2312"));
sb.append("&txtSecretCode="+URLEncoder.encode(txtSecretCode, "GB2312"));
sb.append("&RadioButtonList1="+URLEncoder.encode(RadioButtonList1, "GB2312"));
sb.append("&Button1="+Button1);
sb.append("&lbLanguage="+lbLanguage);
sb.append("&hidPdrs="+hidPdrs);
sb.append("&hidsc="+hidsc);
httpURLConn.setRequestProperty("Content-Length",
String.valueOf(sb.toString().length()));
httpURLConn.setRequestProperty("Referer", main_url);
httpURLConn.setRequestMethod("POST");
httpURLConn.setRequestProperty("Cookie", responseCookie);
//不重定向
httpURLConn.setInstanceFollowRedirects(false);
OutputStream os = httpURLConn.getOutputStream();
os.write(sb.toString().getBytes("GB2312"));
os.close();
//post之后返回的页面
BufferedReader bf = new BufferedReader(new InputStreamReader(httpURLConn.getInputStream(),"GB2312"));
String line1 = null;
while ((line1=bf.readLine())!=null){
System.out.println(line1);
}
System.out.println("responseCode="+httpURLConn.getResponseCode());
System.out.println("重定向地址"+httpURLConn.getHeaderField("Location"));
responseCookie = httpURLConn.getHeaderField("Set-Cookie");
System.out.println(responseCookie);
//登录主界面
String line = null;
url = new URL(forword_url+URLEncoder.encode(txtUserName,"GB2312"));
httpURLConn = (HttpURLConnection)url.openConnection();
httpURLConn.setRequestProperty("Referer", forword_url+URLEncoder.encode(txtUserName,"GB2312"));
httpURLConn.setRequestProperty("Content-Type", "text/xml; charset=GB2312");
httpURLConn.setRequestProperty("Cookie", responseCookie);
httpURLConn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36");
httpURLConn.setRequestMethod("GET");
httpURLConn.setDoInput(true);
httpURLConn.setDoOutput(true);
BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConn.getInputStream(),"GB2312"));
while ((line = br.readLine())!=null){
System.out.println(line);
}
}
catch (ProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
先get页面main_url,从返回页面获取到hidden的viewstate,连同其它参数一起post到main_url。
因为post到main_url之后,服务器端做了一个重定向处理,返回码为302,重定向页面为forword_url+“学号”(也可以在HttpURLConnection的getHeaderField("Location")获得)。
参考资料:http://www.blogfshare.com/php-curl-zhengfang.html