使用Jsoup实现网站简单登录失败,请求技术帮助
解决Jsoup登录后仍返回登录页的问题
你这情况应该是登录请求没被服务器正确认可,明明传了账号密码却还是回到登录页,我帮你梳理几个常见的问题点和解决办法:
1. 先确认登录请求的真实URL
很多网站的登录表单不是直接提交到根域名的,得先访问登录页面,看看表单的action属性值,那才是真正接收登录请求的地址。比如有些网站是/login或者/auth这类路径,直接提交到根域名肯定不行。
示例代码:
// 先获取登录页面,找到登录表单 String baseUrl = "https://moj.tvz.hr"; Document loginPage = Jsoup.connect(baseUrl).get(); Element loginForm = loginPage.select("form").first(); // 提取表单的提交地址 String loginActionUrl = loginForm.attr("action"); // 如果是相对路径,拼接成完整URL if (!loginActionUrl.startsWith("http")) { loginActionUrl = baseUrl + loginActionUrl; }
2. 提交完整的表单参数(别漏了隐藏字段)
登录表单里除了用户名和密码,往往还有隐藏的输入字段——比如CSRF令牌、会话ID这类,服务器靠这些来验证请求是不是合法的,只传login和passwd肯定过不了验证。
示例代码:
// 收集表单里所有带name属性的输入字段 Map<String, String> formData = new HashMap<>(); for (Element input : loginForm.select("input[name]")) { String fieldName = input.attr("name"); String fieldValue = input.attr("value"); formData.put(fieldName, fieldValue); } // 覆盖成你的用户名和密码 formData.put("login", "gost"); formData.put("passwd", "gost");
3. 统一用HTTPS协议
你代码里第一次请求用的是http://moj.tvz.hr,第二次又换成https,协议不一致可能导致cookie无法正确传递。现在大部分网站都强制HTTPS,建议全程用HTTPS访问。
4. 加上浏览器请求头
有些网站会检查请求的User-Agent,如果识别出是爬虫工具(比如Jsoup默认的UA),可能直接拒绝或者返回登录页。模拟一个真实浏览器的UA就能解决这个问题。
示例代码(加到登录请求里):
Response res = Jsoup.connect(loginActionUrl) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") .data(formData) .method(Method.POST) .execute();
完整的修正后代码
把上面的步骤整合起来,试试这段代码:
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.Connection.Method; import org.jsoup.Connection.Response; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class TvzLogin { public static void main(String[] args) throws IOException { String baseUrl = "https://moj.tvz.hr"; String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"; // 1. 获取登录页面,提取表单信息 Document loginPage = Jsoup.connect(baseUrl) .userAgent(userAgent) .get(); Element loginForm = loginPage.select("form").first(); String loginAction = loginForm.attr("action"); String loginUrl = loginAction.startsWith("http") ? loginAction : baseUrl + loginAction; // 2. 收集所有表单参数 Map<String, String> formData = new HashMap<>(); for (Element input : loginForm.select("input[name]")) { formData.put(input.attr("name"), input.attr("value")); } // 设置用户名和密码 formData.put("login", "gost"); formData.put("passwd", "gost"); // 3. 提交登录请求 Response loginResponse = Jsoup.connect(loginUrl) .userAgent(userAgent) .data(formData) .method(Method.POST) .followRedirects(true) // 自动跟随登录后的重定向 .execute(); // 4. 访问登录后的页面,验证是否成功 Document loggedInPage = Jsoup.connect(baseUrl) .userAgent(userAgent) .cookies(loginResponse.cookies()) .get(); System.out.println("登录后页面标题:" + loggedInPage.title()); } }
内容的提问来源于stack exchange,提问作者Sharp
相关产品推荐
相关产品推荐

