使用Jsoup抓取含JSESSIONID的JSP页面登录失败求助
解决Jsoup无法登录目标网站的问题
核心问题分析
你的代码存在几个关键疏漏:直接POST到登录页URL而非表单真实提交地址、未提交登录表单的隐藏字段(如CSRF令牌或会话参数)、请求头不完整,这些都会导致服务器拒绝登录请求。
分步解决方案
- 获取表单真实提交地址:登录页的表单通常不会把数据POST到当前页面,需要先解析页面中的
<form>标签提取action属性的真实地址。 - 提交所有表单字段:登录表单包含隐藏参数(如会话标识),必须和用户名密码一起提交,否则服务器会判定请求非法。
- 完善请求头:添加
Referer、Content-Type等必要请求头,模拟真实浏览器行为。 - 保留完整Cookie上下文:确保登录请求返回的所有Cookie都被用于后续页面访问。
修改后的完整代码
public static void main(String[] args) throws Exception { String loginFormUrl = "https://planif.esiee.fr/jsp/standard/index.jsp"; String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; try { // 1. 获取登录页,提取初始Cookie和表单结构 Connection.Response loginForm = Jsoup.connect(loginFormUrl) .method(Connection.Method.GET) .userAgent(userAgent) .execute(); Map<String, String> initialCookies = loginForm.cookies(); Document loginDoc = loginForm.parse(); // 2. 定位登录表单,提取真实提交地址 Element loginFormElement = loginDoc.selectFirst("form"); if (loginFormElement == null) { System.err.println("页面未找到登录表单"); return; } String loginActionUrl = loginFormElement.attr("action"); // 拼接相对路径为绝对URL if (!loginActionUrl.startsWith("http")) { loginActionUrl = "https://planif.esiee.fr" + loginActionUrl; } // 3. 收集所有表单字段(含隐藏字段) Map<String, String> formData = new HashMap<>(); loginDoc.select("input").forEach(input -> { String name = input.attr("name"); String value = input.attr("value"); if (!name.isEmpty()) { formData.put(name, value); } }); // 覆盖用户名和密码 formData.put("login", "lecteur1"); formData.put("password", ""); // 4. 提交登录请求 Connection.Response loginResponse = Jsoup.connect(loginActionUrl) .cookies(initialCookies) .data(formData) .userAgent(userAgent) .header("Referer", loginFormUrl) .header("Content-Type", "application/x-www-form-urlencoded") .followRedirects(true) .method(Connection.Method.POST) .execute(); System.out.println("登录响应状态码: " + loginResponse.statusCode()); System.out.println("登录响应内容预览: " + loginResponse.parse().text().substring(0, 500)); // 5. 访问登录后的目标页面 Document projectsPage = Jsoup.connect("https://planif.esiee.fr/jsp/standard/projects.jsp") .cookies(loginResponse.cookies()) .userAgent(userAgent) .header("Referer", loginActionUrl) .get(); System.out.println("目标页面标题: " + projectsPage.title()); System.out.println("目标页面内容预览: " + projectsPage.text().substring(0, 1000)); } catch (IOException e) { e.printStackTrace(); } }
调试建议
如果仍未成功,添加以下代码打印请求细节,排查具体问题:
// 打印登录请求的所有参数 System.out.println("提交的表单参数: " + formData); // 打印登录响应的所有Cookie System.out.println("登录后Cookie: " + loginResponse.cookies());
内容的提问来源于stack exchange,提问作者PatriotLegends
相关产品推荐
相关产品推荐

