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
HttpURLConnection模拟登录学校的正方教务系统的更多相关文章
- Java模拟登录带验证码的教务系统(原理详解)
一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...
- 在Android上模拟登录广工正方教务系统查询成绩
这是在博客园里开博以来写的第一篇博客. 因为之前看过很多人都有发过关于模拟登录正方软件获取数据的文章,自己觉得挺好玩的便也去动手一做,开始还以为挺难的,但实际做起来还蛮简单的,当然其中还有些小插曲. ...
- 广州商学院Python正方教务系统爬虫(获取个人信息成绩课表修改密码)
使用python的requests库简单爬取,使用xpath解析内容 可以获取个人信息.个人照片.成绩单和课表 github地址:https://github.com/PythonerKK/GZCC- ...
- JavaScript之正方教务系统自动化教评[插件-转载]
[声明]本插件系学院学长原创,非博主所创,发布此处,仅供学习和效仿. /** * @name:正方教务系统自动化教评-插件 * * @author:chenzhongshu * @date:2017- ...
- Golang模拟用户登陆,突破教务系统
目录 一.Golang模拟用户登陆,突破教务系统 1.1 请求登陆页面 1.2 抓包分析登陆请求 1.3 golang使用js引擎合成salt 1.4 模拟表单提交,完成登陆 1.5 进入成绩查询页, ...
- 以正方教务系统为例,用php模拟登陆抓取课表、空教室
课程格子和超级课程表这两个应用,想必大学生都很熟悉,使用自己的学号和教务系统的密码,就可以将自己的课表导入,随时随地都可以在手机上查看. 其实稍微了解一点php的话,我们也可以做一个类似这样的web ...
- HttpClient+Jsoup模拟登陆贺州学院教务系统,获取学生个人信息
前言 注:可能学校的教务系统已经做了升级,当前的程序不知道还能不能成功获取信息,加上已经毕业,我的账户已经被注销,试不了,在这里做下思路跟过程的记录. 在我的毕业设计中”基于SSM框架贺州学院校园二手 ...
- 课程助理For Windows(预览版,正方教务系统学生查分工具)
其实盖子已经开发了一个功能更强大的版本,但是那个版本依然基于正方系统,也就是说只要正方系统跪了或者张院士在网站上做点手脚,这个小工具就会失效. 今天给大家的版本虽然功能及其简单.界面极端丑陋,但是通过 ...
- 正方教务系统客户端 error loading midas.dll.
在windows xp/7/10上安装了客户端,安装到注册字体一步,没有响应,强行结束.启动客户端,登录,出现 error loading midas.dll. 32位:先将 midas.dll 放 ...
随机推荐
- Matplotlib ValueError: _getfullpathname: embedded null character
Traceback (most recent call last): File "<stdin>", line 1, in <module> File &q ...
- 37-python基础-python3-字典的常用方法-keys()-values()-items()
有 3 个字典方法,它们将返回类似列表的值,分别对应于字典的键.值和键-值对:keys().values()和 items(). 这些方法返回的值不是真正的列表,它们不能被修改,没有append()方 ...
- lzma 知识点滴
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/xuweiwei1860/article/details/31419195 LZMA(Lempel-Z ...
- css3两个汤圆亲吻动效
效果图: 模板来源:https://www.17sucai.com/pins/demo-show?id=35132 自己仿写出来的效果图: 笔记: 1.transform:translate(-50% ...
- LINUX搭建网站环境教程
安装Mysql yum install mysql-server -y 启动Mysql service mysqld restart 此实验使用 mysql 默认账户名和密码,您也可以设置自己的 My ...
- Django rest_framework 频率控制组件
频率控制 一.频率控制实现一 from rest_framework.views import APIView from rest_framework.response import Response ...
- 如何在MySQL中删除表中指定列的唯一键?
语法结构如下: alter table table_name drop index column_name;
- sping+quartz定时任务的最简单实践
1,启动spring容器 Tomcat启动的时候,加载web.xml的listener和context-param,spring的listener监听到对应的contextConfigLocation ...
- java 居民身份证的校验
import java.text.SimpleDateFormat; import java.util.Date; /** * 验证身份证号码 身份证号码, 可以解析身份证号码的各个字段, * 以及验 ...
- 【Flutter学习】基本组件之文本组件Text
一,概述 文本组件(Text)负责显示文本和定义显示样式, 二,继承关系 Object > Diagnosticable > DiagnosticableTree > Widget ...