Exception in thread “main“ org.jsoup.HttpStatusException: HTTP error fetching URL. Status=422, URL=

在使用JSoup模拟登录我校内网的时候报了如下错误:

Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=422, URL=https://webvpn.ncepu.edu.cn/users/sign_in
	at jsoup@1.10.2/org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:679)
	at jsoup@1.10.2/org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:628)
	at jsoup@1.10.2/org.jsoup.helper.HttpConnection.execute(HttpConnection.java:260)
	at EDM.login_final.main(login_final.java:66)

错误原因:模拟登录需要提交表单数据(浏览器按F12可查看):

utf8: ✓
authenticity_token: DNLRC2amJXtJtAypVp+4O9igPVAd+743zAK9AJbkTXWiojT0612nc5bDJjQjdX0au/YWR7xnbOwtULk4O5ACpg==
user[login]: ************
user[password]: ******
user[dymatice_code]: unknown
commit: 登录 Login

刚开始我是直接手动给connect对象添加数据,总是报422错误。调试了一段时间后发现:表单数据中的authenticity_token竟然是动态变化的…。于是这种做法就是错误的:

connect.data("user[login]", "************").data("user[password]", "******");
connect.data("dymatice_code", "unknown").data("utf8", "?").data("commit", "登录 Login");
connect.data("authenticity_token", "dbZNX3RljHFODgsb3tqZszd/jHjOrQYvnfhwWrPzTCU39NfVO9UcG5/rT3aKgxYu7xfCudoq4ibcDfn0rCZG0A==");

解决办法:动态请求网页数据来获得form data:

Connection con = Jsoup.connect(LOGIN_URL); 
con.header(USER_AGENT, USER_AGENT_VALUE); 
Response res = con.execute();
Document d = Jsoup.parse(res.body());       // 通过Jsoup将返回信息转换为Dom树
List<Element> elements = d.select("form");  // 获取提交form表单,可以通过查看页面源码代码得知
Map<String, String> datas = new HashMap<>();
for (Element e : elements.get(0).getAllElements()) {
    if (e.attr("name").equals("user[login]")) {
        e.attr("value", ************);
    }
    if (e.attr("name").equals("user[password]")) {
        e.attr("value", ******);
    }
     //添加其它信息
    if (e.attr("name").length() > 0) {
        datas.put(e.attr("name"), e.attr("value"));
    }
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值