You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

APEX 21.1如何正确对页面项URL编码避免GET_URL二次编码

Oracle APEX URL二次编码问题解决

问题背景

表单上RESET_PSWD按钮绑定的动态操作包含4个True分支动作:

  1. Confirm 确认动作
  2. 服务端执行PL/SQL存储过程生成新的临时密码
  3. 服务端执行PL/SQL存储过程,调用APEX_PAGE.GET_URL生成模态框访问URL
  4. 执行JavaScript代码,使用步骤3生成的URL打开模态框

动态操作预期目标为:生成临时密码后,将密码作为参数拼接进模态框跳转URL,最终跳转模态框。当前遇到的问题为P7_TEMP_PSWD的取值因请求调用期间特殊字符未正确URL编码被截断。

原有实现代码

-- package procedure to get & set url for confirmation modal (Step 3)
PROCEDURE get_feedback_url (
  p_username   VARCHAR2,
  p_temp_pswd  VARCHAR2
) IS

  vcPswdEncoded  VARCHAR2(1000);
  vcURL          VARCHAR2(1000);
  vcValueList    VARCHAR2(1000);

BEGIN

  vcPswdEncoded := APEX_UTIL.URL_ENCODE(p_temp_pswd);
  vcValueList   := p_username ||','|| vcPswdEncoded;

  vcURL := APEX_PAGE.GET_URL(p_page   => '12',
                              p_items  => 'P12_USERNAME,P12_TEMP_PSWD',
                              p_values => vcValueList,
                              p_plain_url => TRUE);

  APEX_UTIL.SET_SESSION_STATE('P7_FEEDBACK_URL', vcURL);

EXCEPTION
  WHEN OTHERS THEN
    csa.rsn_logger.log_error(p_rsn_app => 'RSNUM',
                              p_app_loc => 'rsnum_user.get_feedback_url',
                              p_log_msg => SQLERRM);
END;

问题说明

已经尝试在拼接URL前对临时密码做URL编码,APEX_UTIL.ENCODE_URL输出的编码结果符合预期,但APEX_PAGE.GET_URL会对传入的参数值再次编码,导致其中的%符号被二次编码。主动调用编码方法的原因是APEX默认不会对#等少数特殊字符编码,此前已经因此出现过问题,需要关闭GET_URL的自动编码逻辑。


解决方案

APEX_PAGE.GET_URL未提供直接关闭自动编码的参数,可选用以下两种方案适配需求:

方案1:删除主动编码逻辑,直接传原始值

APEX_PAGE.GET_URL的内置自动编码逻辑已经覆盖了#、&、空格等所有URL敏感字符,此前遇到的未编码问题多为旧版本APEX缺陷或手动拼接URL导致。直接传入未编码的原始临时密码即可,无需提前调用APEX_UTIL.URL_ENCODE,修改后代码如下:

PROCEDURE get_feedback_url (
  p_username   VARCHAR2,
  p_temp_pswd  VARCHAR2
) IS

  vcURL          VARCHAR2(1000);
  vcValueList    VARCHAR2(1000);

BEGIN

  vcValueList   := p_username ||','|| p_temp_pswd;

  vcURL := APEX_PAGE.GET_URL(p_page   => '12',
                              p_items  => 'P12_USERNAME,P12_TEMP_PSWD',
                              p_values => vcValueList,
                              p_plain_url => TRUE);

  APEX_UTIL.SET_SESSION_STATE('P7_FEEDBACK_URL', vcURL);

EXCEPTION
  WHEN OTHERS THEN
    csa.rsn_logger.log_error(p_rsn_app => 'RSNUM',
                              p_app_loc => 'rsnum_user.get_feedback_url',
                              p_log_msg => SQLERRM);
END;

方案2:手动拼接URL,自主控制编码逻辑

如果需要自定义编码规则,可放弃APEX_PAGE.GET_URL,自行拼接完整URL,代码示例如下:

PROCEDURE get_feedback_url (
  p_username   VARCHAR2,
  p_temp_pswd  VARCHAR2
) IS

  vcPswdEncoded  VARCHAR2(1000);
  vcURL          VARCHAR2(1000);

BEGIN

  vcPswdEncoded := APEX_UTIL.URL_ENCODE(p_temp_pswd);
  -- 手动拼接URL,可根据实例配置调整基础路径、校验和参数
  vcURL := 'f?p=' || :APP_ID || ':12:' || :APP_SESSION || '::NO::P12_USERNAME,P12_TEMP_PSWD:' || APEX_UTIL.URL_ENCODE(p_username) || ',' || vcPswdEncoded;

  APEX_UTIL.SET_SESSION_STATE('P7_FEEDBACK_URL', vcURL);

EXCEPTION
  WHEN OTHERS THEN
    csa.rsn_logger.log_error(p_rsn_app => 'RSNUM',
                              p_app_loc => 'rsnum_user.get_feedback_url',
                              p_log_msg => SQLERRM);
END;

注意:手动拼接URL时需确保会话ID、权限校验参数配置正确,避免访问报错。

内容的提问来源于stack exchange,提问作者McRivers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 19:54:03