如何正确对页面项目进行 URL 编码 - APEX 21.1

时间:2021-07-19 16:46:52

标签: oracle-apex

我在表单上有一个 RESET_PSWD 按钮,它调用动态操作并定义了 4 个真正的操作。

  1. Confirm 操作
  2. Execute Server-side Code - 生成新临时 pswd 的 PL/SQL 过程
  3. Execute Server-side Code - 使用 APEX_PAGE.GET_URL
  4. 生成模态 URL 的 PL/SQL 过程
  5. Execute JavaScript Code - 使用第 3 步中的 url 打开模态

DA 的目标是生成一个临时密码,构建一个指向模态的 URL(传入第 2 步中的新临时密码),然后导航到模态。在 Step 2Step 3 之间,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 之前对 temp pswd 进行 url 编码,但我得到以下结果:

enter image description here

使用 APEX_UTIL.ENCODE_URL 后的值是我想要的,但似乎 APEX_PAGE.GET_URL 也在对值进行编码,因此再次对 '%' 进行编码。有没有办法选择退出 GET_URL 这样做?我首先使用 ENCODE_URL 的原因是因为默认情况下 APEX 没有编码“#”(和一些其他字符),这最初给我带来了问题。

1 个答案:

答案 0 :(得分:0)

希望有更好的方法来做到这一点,但找到了一个可行的解决方案(需要测试边缘情况,但似乎可行)。我使用以下表达式在模态页面上创建了一个 Before Header 计算:

UTL_URL.UNESCAPE(:P12_TEMP_PSWD)