java 验证码 模拟登陆_Java实现模拟登录带验证码的教务系统

本文介绍了一个使用Java模拟登录带有验证码的教务系统的实现过程。讲解了模拟登录的基本原理,包括通过Session管理和Cookie保持会话状态。文章详细展示了如何利用Jsoup框架下载验证码、保存Cookie、登录以及加密参数的方法。此外,还提到了一个无需验证码的登录网址,但需要对用户名和密码进行特定的前端加密。
摘要由CSDN通过智能技术生成

一:原理

客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求。我们通过Chrome浏览器进行网页访问时,服务器会在我们第一次请求时就建立会话生成Session对象,然后给我们的浏览器返回该Session ID,并把Session的ID保存在客户机的Cookie中,如图:我们的每次请求都带上我们的Cookie,就可以实现会话状态的保持。

5e6acda3b548195f968e49d5f46e1316.png

二:代码

Jsoup应该是Java最简单的网页解析框架

下载地址:https://jsoup.org/download

该实例以强智教务系统为例:http://jwxt.qlu.edu.cn

package cn.zyzpp.eduCookie;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

import org.jsoup.Connection;

import org.jsoup.Connection.Method;

import org.jsoup.Connection.Response;

import org.jsoup.Jsoup;

import org.junit.Before;

import org.junit.Test;

import cn.zyzpp.eduCookie2.S;

/**

* 模拟登录带验证码的教务系统

*

* 2018-2-9

*/

public class JsoupSafeCode{

private String url_safecode = "http://jwxt.qlu.edu.cn/verifycode.servlet?t=0.020974584"; // 验证码

private String url_encode = "http://jwxt.qlu.edu.cn/Logon.do?method=logon&flag=sess"; // 加密字符串

private String url_Login = "http://jwxt.qlu.edu.cn/Logon.do?method=logon"; // 登录

private String username = "";

private String password = "";

private String path = JsoupSafeCode.class.getResource("/").getPath().replaceAll("%20", " ") + "safecode.png";

private Map cookie;

/**

* 下载验证码

* 保存Cookie

* @throws IOException

*/

public void getSafeCode() throws IOException{

Response response = Jsoup.connect(url_safecode).ignoreContentType(true) // 获取图片需设置忽略内容类型

.userAgent("Mozilla").method(Method.GET).timeout(3000).execute();

cookie = response.cookies();

byte[] bytes = response.bodyAsBytes();

Util.saveFile(path, bytes);

System.out.println("保存验证码到:" + path);

}

/**

* 登录教务系统

*/

public void initLogin() throws IOException{

S.print("输入验证码:");

Scanner scan = new Scanner(System.in);

String code = scan.next();

try {

Map data = new HashMap();

data.put("view", "1");

data.put("encoded", getEncoded());

data.put("RANDOMCODE", code);

Connection connect = Jsoup.connect(url_Login)

.header("Accept",

"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")

.userAgent("Mozilla").method(Method.POST).data(data).timeout(3000);

for (Map.Entry entry : cookie.entrySet()) {

connect.cookie(entry.getKey(), entry.getValue());

}

Response response = connect.execute();

S.println(response.parse().text().toString());

} catch (IOException e) {

}

}

/**

* 加密参数(依具体环境而定,加密算法一般在JS中获得)

*/

public String getEncoded(){

try {

Connection connect = Jsoup.connect(url_encode)

.header("Accept",

"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")

.userAgent("Mozilla").method(Method.POST).timeout(3000);

for (Map.Entry entry : cookie.entrySet()) {

connect.cookie(entry.getKey(), entry.getValue());

}

Response response = connect.execute();

String dataStr = response.parse().text();

// 把JS中的加密算法用Java写一遍:

String scode = dataStr.split("#")[0];

String sxh = dataStr.split("#")[1];

String code = username + "%%%" + password;

String encoded = "";

for (int i = 0; i < code.length(); i++) {

if (i < 20) {

encoded = encoded + code.substring(i, i + 1)

+ scode.substring(0, Integer.parseInt(sxh.substring(i, i + 1)));

scode = scode.substring(Integer.parseInt(sxh.substring(i, i + 1)), scode.length());

} else {

encoded = encoded + code.substring(i, code.length());

i = code.length();

}

}

return encoded;

} catch (IOException e) {

}

return null;

}

}

继续:

package cn.zyzpp.eduCookie;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

public class Util{

/**

* 将字节流转换成文件

*

* @param filename

* @param data

* @throws Exception

*/

public static void saveFile(String filename, byte[] data){

if (data != null) {

String filepath = filename;

File file = new File(filepath);

if (file.exists()) {

file.delete();

}

try {

FileOutputStream fos = new FileOutputStream(file);

fos.write(data, 0, data.length);

fos.flush();

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

后记

在模拟登陆该教务系统时,笔者观察到该教务系统还有一个不需要验证码即可登陆的网址:http://jwxt.qlu.edu.cn/jsxsd/xsxk/xklc_list,不过这个需要把用户名和密码通过JS算法进行前端加密合成为encoded字符串,如下

String encoded = playJs(username) + "%%%" + playJs(password);

然后直接带参POST即可。具体的playJs()方法我会稍后发出。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值