使用Java JSoup库登录网页时遭遇URL未找到错误:请求的URL /pls/apex/f不存在
解决JSoup登录时"/pls/apex/f未找到"的问题
看起来你在使用JSoup登录Oracle APEX风格的页面时踩了路径的坑,错误提示里的/pls/apex/f明显不是表单实际要提交的目标地址,我帮你分析下问题和解决方案:
首先看你贴的登录页面源码,表单的action是wwv_flow.accept,这是一个相对路径,意味着你不能直接请求/pls/apex/f,而是要把这个相对路径和登录页面的基础URL拼接起来。
核心问题分析
你遇到的404错误,大概率是因为请求的目标URL写错了——这类Oracle APEX的登录表单提交地址,应该是登录页面所在的基础路径加上wwv_flow.accept,而不是你当前请求的/pls/apex/f。
分步解决方案
确认完整的提交URL
假设你的登录页面完整URL是https://your-domain.com/pls/apex/login,那么表单提交的目标URL应该是https://your-domain.com/pls/apex/wwv_flow.accept(把登录页的路径最后一部分替换成wwv_flow.accept,或者直接拼接基础路径和action值)。正确获取动态参数并提交请求
APEX的登录表单里有很多动态生成的隐藏参数(比如p_instance、p_page_submission_id),这些参数不能硬编码,必须先请求登录页面拿到最新的值,同时带上会话Cookie,否则登录会失败。给你一段可参考的代码:
import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class ApexLogin { public static void main(String[] args) throws Exception { // 替换成实际的登录页面URL String loginPageUrl = "https://your-domain.com/pls/apex/your-login-page-path"; // 拼接表单提交的目标URL String submitUrl = loginPageUrl.substring(0, loginPageUrl.lastIndexOf("/") + 1) + "wwv_flow.accept"; // 第一步:获取登录页面,拿到Cookie和隐藏参数 Connection.Response loginFormResponse = Jsoup.connect(loginPageUrl) .method(Connection.Method.GET) .execute(); // 第二步:构造登录请求,带上所有必要参数 Document loggedInDoc = Jsoup.connect(submitUrl) // 带上登录页面返回的Cookie,维持会话 .cookies(loginFormResponse.cookies()) // 实际代码建议动态解析页面获取参数,不要硬写死 .data("p_flow_id", "153") .data("p_flow_step_id", "101") .data("p_instance", "7648174266222019") .data("p_page_submission_id", "196107580566815") .data("p_request", "") // 替换成实际页面的用户名、密码字段名(需查看输入框的name属性) .data("p_username", "your-actual-username") .data("p_password", "your-actual-password") .method(Connection.Method.POST) .execute() .parse(); // 验证登录是否成功:打印登录后的页面标题 System.out.println("登录后的页面标题:" + loggedInDoc.title()); } }关键注意事项
- 不要硬编码隐藏参数:实际代码里应该用
loginFormResponse.parse()来解析登录页面,动态提取p_flow_id、p_instance等参数的值,因为这些值每次会话可能会变化。 - 确认用户名密码字段名:你贴的源码里没显示登录输入框,需要查看页面里的用户名、密码输入框的
name属性,通常是p_username和p_password,但要以实际页面为准。 - 检查URL拼接是否正确:如果登录页面的路径是
https://your-domain.com/pls/apex(没有后缀),那么提交URL就是https://your-domain.com/pls/apex/wwv_flow.accept。
- 不要硬编码隐藏参数:实际代码里应该用
内容的提问来源于stack exchange,提问作者TORNEDO
相关产品推荐
相关产品推荐

