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 放 ...
随机推荐
- 三、函数 (SUM、MIN、MAX、COUNT、AVG)
第八章 使用数据处理函数 8.1 函数 SQL支持利用函数来处理数据.函数一般是在数据上执行的,给数据的转换和处理提供了方便. 每一个DBMS都有特定的函数.只有少数几个函数被所有主要的DBMS等同的 ...
- 《代码大全2》读书笔记 Week8
这一周博主阅读了<代码大全2>第11章至第13章,第三部分——"变量"就结束了,第四部分作者将转入语句的讨论. 第十一章作者详细阐述了变量名的有效命名规则,第十二和十三 ...
- CSS和jQuery分别实现图片无缝滚动效果
一.效果图 二.使用CSS实现 <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- 【记录】gitLab git命令add commit fetch pull push
最近项目使用git进行版本控制,由于之前用svn,所以对git不是太熟悉,网上一通乱找git各命令含义, 以下内容感觉讲的很详细,可以很清楚理解git提交流程,博主把重要的信息用红字标注了,更加显眼. ...
- Mysql差集
记录一个去差集的SQL 今天用sql去同步部分历史数据,需要用到一个求差集的sql 两张表简单结构如下: 有一个会员表 一个会员账户表 获取没有账户的会员 SELECT m.pkMember FROM ...
- linux环境安装opencv导入依赖报错问题
linux环境通过pip安装opencv后,导入cv2时报错: 在centos和ubuntu环境下都遇到相同的问题.报错原因: 缺少共享库 有两种解决办法: 一.使用如下命令查看缺少得共享库 yum ...
- leetcode-162周赛-1254-统计封闭岛屿数量
题目描述: 自己的提交: class Solution: def closedIsland(self, grid: List[List[int]]) -> int: def dfs(grid,r ...
- 获取min-max之间的随机数
private static String getRandom(int min, int max){ Integer random =(int)(min+Math.random()*(max-min+ ...
- springBoot和MyBatis整合中出现SpringBoot无法启动时处理方式
在springBoot和Myatis 整合中出现springBoot无法启动 并且报以下错误 Description: Field userMapper in cn.lijun.control ...
- PHP ftp_login() 函数
定义和用法 ftp_login() 函数登录 FTP 服务器. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE 和一个警告. 语法 ftp_login(ftp_connection,us ...