问题分析

通过HttpClient获取网页数据源,通过Jsoup解析数据。先模拟登录统一身份认证平台,再通过单点登录方式登录正方教务系统,最后获取相关信息。模拟浏览器正常操作,封装请求头信息获取SESSIONID。

解决方案

Maven

        <dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.8.0</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20160810</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency>

登录统一身份认证平台

登录请求表单数据

密钥与加密密码均为Base64编码

常见加密:

1)数据加密标准(DES Data Encryption Standard):DES(密钥长度64位)(ECB模式)

2)分组密码算法:AES(密钥长度在128位及以上)(GCM或CBC模式)

3)流密码算法:AES(密钥长度在128位及以上)(OFB或CTR模式)、chacha20

4)哈希算法:SHA2、SHA3

5)密钥交换算法:DSA/DH(密钥长度2048位及以上)、ECDH(密钥长度223及以上)

6)HMAC(基于哈希的消息验证码)算法:HMAC-SHA2

7)非对称加密算法:RSA(2048位及以上)、ECC(256位以上)

DEC解密

此统一身份认证平台密码加密采用DES/ECB/PKCS7Padding方式加密。

相关加密解密方法,自行百度。

参考:https://shentuzhigang.blog.csdn.net/article/details/107323907

密钥获取

在登录页面HTML代码中可以找到

模拟登录

package cn.edu.zstu.myzstu.spyder.sso;import cn.edu.zstu.myzstu.model.Student;
import cn.edu.zstu.myzstu.utils.DESUtil;
import cn.edu.zstu.myzstu.utils.httpclient.HTTPResponse;
import cn.edu.zstu.myzstu.utils.httpclient.HttpClientUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Author ShenTuZhiGang* @Version 1.0.0* @Date 2020-03-20 18:04*/
@Component
public class SSOLoginer {private final String LOGIN_URL="https://sso.zstu.edu.cn/login";public boolean login(String username,String password){Document doc = Jsoup.parse(HttpClientUtils.doGetRequest(LOGIN_URL,null,null));String currentLoginType = doc.select("#current-login-type").html();String loginCroypto = doc.select("#login-croypto").html();String ssoSecond = doc.select("#sso-second").html();String userId = doc.select("#user-id").html();String userObjectId = doc.select("#user-object-id").html();String lphoneNumber = doc.select("#phone-number").html();String loginRuleType = doc.select("#login-rule-type").html();String loginPageFlowKey = doc.select("#login-page-flowkey").html();String captchaUrl = doc.select("#captcha-url").html();String redirectUri = doc.select("#redirect-uri").html();String loginBackUri = doc.select("#login-back-uri").html();String loginErrorCode = doc.select("#login-error-code").html();String recaptchaInvisible = doc.select("#recaptcha-invisible").html();Map<String,String> params=new HashMap<>();params.put("username",username);params.put("type",currentLoginType);params.put("_eventId","submit");params.put("geolocation","");params.put("execution",loginPageFlowKey);params.put("captcha_code","");params.put("croypto",loginCroypto);params.put("password", DESUtil.encrypt(loginCroypto,password));HTTPResponse httpResponse = HttpClientUtils.doPostRequest(LOGIN_URL, null, params);System.out.println(loginCroypto);System.out.println(DESUtil.encrypt(loginCroypto,password));System.out.println(httpResponse);return true;}
}

注:HttpClient封装工具类,自行百度。

参考:https://shentuzhigang.blog.csdn.net/article/details/104274609

登录正方教务系统

单点登录抓包

单点登录

package cn.edu.zstu.myzstu.spyder.edu;import cn.edu.zstu.myzstu.spyder.sso.SSOLoginer;
import cn.edu.zstu.myzstu.utils.httpclient.HttpClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.List;/*** @Author ShenTuZhiGang* @Version 1.0.0* @Date 2020-07-13 23:36*/
@Component
public class EduSSOLoginer {@Autowiredprivate SSOLoginer ssoLoginer=new SSOLoginer();public boolean login(String username,String password){if(ssoLoginer.login(username,password)){String location= HttpClientUtils.doGetRequest("https://sso.1.edu.cn/login?service=http%3A%2F%2Fjw.1.edu.cn%2Fsso%2Fjasiglogin",null,null);int i;List<String> list = new ArrayList<>();for(i=0 ;i<6;i++){//如果是重定向,则继续请求。if(location.contains("http")&&location.length()<150){list.add(location);location = HttpClientUtils.doGetRequest(location,null,null);}else{break;}}System.out.println(i);for (String str:list) {System.out.println(str);}return true;}return false;}
}

测试

@Testpublic void Gradetest4() throws Exception {System.out.println("Gradetest4");EduSpyder eduSpyder = new EduSpyder();EduSSOLoginer eduSSOLoginer = new EduSSOLoginer();GradeParser gradeParser = new GradeParser();List<Grade> data = null;try {if(eduSSOLoginer.login("username","password")) {data = gradeParser.parse(eduSpyder.crawlGrades(new Student()));}} catch (Exception e) {throw e;}List<Grade> scoreList= data;for(Grade score:scoreList){System.out.println(score);}System.out.println(scoreList.size());}
    //获取成绩信息页面public String crawlGrades(Student stu) {Map<String,String>scoreParams=new HashMap<>();scoreParams.put("xnm","");scoreParams.put("xqm","");scoreParams.put("_search","false");scoreParams.put("nd",""+new Date().getTime());scoreParams.put("queryModel.showCount","100");scoreParams.put("queryModel.currentPage","1");scoreParams.put("queryModel.sortName","");scoreParams.put("queryModel.sortOrder","asc");scoreParams.put("time","1");try {String scoreResponse = HttpClientUtils.doPostRequest(CHECK_GRADE_URL,null,scoreParams).getContent();return  scoreResponse;}catch (Exception e){e.printStackTrace();}return null;}

注:成绩页面解析与成绩类等,自行编写。

参考:https://shentuzhigang.blog.csdn.net/article/details/104262854

运行结果

参考文章

https://shentuzhigang.blog.csdn.net/article/details/107323907

https://shentuzhigang.blog.csdn.net/article/details/103996741

https://shentuzhigang.blog.csdn.net/article/details/104262854

JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案相关推荐

  1. java单点登录统一认证,JEECG 集成KiSSO单点登录实现统一身份认证

    JEECG 集成KiSSO单点登录实现统一身份认证 JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录? 第三方系统如何对接呢? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的 ...

  2. JEECG 集成KiSSO单点登录实现统一身份认证

    JEECG 集成KiSSO单点登录实现统一身份认证 JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录? 第三方系统如何对接呢? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的 ...

  3. Dynamics 365 CRM 接入统一身份认证平台(单点登录集成)

    打算将D365 CRM接入公司统一身份认证平台. 前提:D365 已IFD部署,因为要借助ADFS来完成单点登录. 登录ADFS服务器,打开ADFS,本次集成,统一身份认证为上游,ADFS是下游,因为 ...

  4. springmvc--sso单点登录cas统一身份认证器

    开发环境 maven idea Windows 10 JDK 1.8+ 域名解析的配置 这里通过SwitchHosts来实现:以管理员身份打开 前两个:两个客户端应用的域名 后一个:是服务端的域名. ...

  5. 统一身份管理平台IAM单点登录流程及第三方接口设计方案

    #统一身份管理平台IAM 很多企业都有多个办公系统,账号.密码.角色.权限等均需要单独设置且不能实现统一管理. 统一身份认证管理系统IAM,我认为有以下三个优点: 建立统一的用户管理.身份配给和身份认 ...

  6. 构建基于分布式SOA架构的统一身份认证体系

    摘要:本文充分利用SOA架构松耦合的特点,通过规范统一网络接口实现业务系统整合,既提升系统安全性,又简化资源访问操作,具有重要的理论和现实意义. 统一身份认证旨在将分散在各个信息系统中的用户和权限资源 ...

  7. JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解

    目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...

  8. SSO单点登录简析 身份认证 安当加密

    本文介绍SSO概念和简略方案原理,不拆解协议细节. 一.身份认证 身份是一切信任的基础.基于身份的信任思维就是不信任企业内部和外部的任何人.任何系统,需要基于身份认证和授权,执行以身份为中心的访问控制 ...

  9. cas如何实现多系统间的相互认证_统一身份认证和单点登录的区别

    首先大家会遇到这样一个问题,统一身份认证和单点登录的概念是什么? 百度百科对统一身份认证的定义 所谓身份认证,就是判断一个用户是否为合法用户的处理过程.最常用的简单身份认证方式是系统通过核对用户输入的 ...

最新文章

  1. UI培训分享:学UI设计需要知道哪些事情?
  2. Spring MVC-04循序渐进之基于注解的控制器
  3. Python数据分析之全球人口数据
  4. java高并发日志_高并发下log4j的性能瓶颈
  5. [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法
  6. Python操作数据库遇到的问题
  7. 2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)
  8. Stack Overflow 2017 开发者调查报告(程序员必看)
  9. 对Photoshop高斯模糊滤镜的算法总结
  10. Sublime Text for Mac如何支持GBK编码
  11. 前端基础篇之 CSS 世界
  12. 如何选择一个好的简历模板
  13. NUC980 NuWriter无法烧录固件
  14. PMP备考之路 - 汪博士第十二章(项目采购管理)
  15. P1757 通天之分组背包题解
  16. UVA 167 - The Sultan‘s Successors
  17. 【机器学习线性代数】06 解方程组:从空间的角度再引入
  18. 唐家三少 依然领跑
  19. 用js代码实现四位验证码
  20. 最详细的XAMPP的安装及使用教程(图文)

热门文章

  1. 多线程搜索磁盘上的文件
  2. 计算机网络.doc,计算机网络network.doc
  3. c 语言中下标运算符,详解C++中二进制求补运算符与下标运算符的用法
  4. qoq是什么意思的缩写_“yjgj他的pyq很zqsg”,90后从未觉得自己老,直到看到00后缩写的那一秒……...
  5. action与servlet用法区别
  6. mysql对库授权alter_mysql 数据库授权(给某个用户授权某个数据库)
  7. brew安装_苹果mac系统必须安装python3
  8. python高斯分布训练_Python画图高斯分布的示例
  9. php三个数字比较大小排序,php中常用的4种实现数字大小排序的冒泡选择等算法函数代码...
  10. android 蓝牙通讯实现手机蓝牙的开启,并扫描附近可见的蓝牙设备