Oracle Apex 从 ajax 请求中获取 cookie

Oracle Apex get cookie from an ajax request

如何从来自非 apex 页面(在 apex 服务器内)的 ajax 发起的请求中获取 oracle 中 cookie 的值?

我想首先创建一个 return 登录 cookie 值的函数,然后使用该函数将 return 值发送给浏览器以查看是否可以完成。

所以我使用以下来源创建了一个资源模板和处理程序:select test() from dualtest 函数声明为:

create or replace function test return varchar2
is
   c owa_cookie.cookie;
begin
   c := owa_cookie.get('LOGIN_USERNAME_COOKIE');
   return c.vals(1);
end;

当我 运行 select test() from dual 从 sql 命令 window 我得到了 cookie 的值,但是当我用 ajax 我收到以下错误:

An error occurred when evaluating the SQL statement associated with this resource. SQL Error Code 6502, Error Message: ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.OWA_UTIL", line 354
ORA-06512: at "SYS.OWA_COOKIE", line 59
ORA-06512: at "SYS.OWA_COOKIE", line 179
ORA-06512: at "<no need to see this>.TEST", line 5

我一直在使用以下调用(通过网络开发工具检查结果) $.ajax({url: "<handler url here>"})

更新: 我使用 rest 服务的原因是因为发起请求的页面不是 apex 应用程序,而是在同一个域中(因此它具有相同的 cookie)。

要从 APEX 中的 AJAX 请求获取 cookie,您可以使用 OWA_COOKIE 包,但您不需要定义任何模板或处理程序。这一切都可以在页面内完成(或从页面内调用外部过程)。以下是我用来获取 JSESSIONID cookie 的步骤。

我已经构建了一个 example application on apex.oracle.com 您可以查看。

页面设置

页面非常简单,只有一个文本框和一个按钮。按钮的操作设置为 重定向到 URL,这是目标:

javascript: apex.server.process("AJAX_TEST", { }, { success: function (pData) { console.log(pData); apex.item("P10_JSESSIONID").setValue(pData); }, dataType: "text", error: function (jqXHR, textStatus, errorThrown) { } }).always(function () {  });

javascript 正在调用 AJAX 回调(如下所示)并将输出存储在 P10_JSESSIONID 页面项中,并将其记录到浏览器控制台。

AJAX 回调设置

AJAX回调中的代码与您分享的代码非常相似。我正在获取 cookie,然后使用 HTP.P 将其打印出来。这就是 return 将 cookie 的值用于您想要的页面所需要的全部内容。如果您愿意,也可以使 AJAX 回调调用中的代码成为编译到数据库中的独立过程。

更新

我更新了我的示例应用程序,以便有一个下拉列表显示所有 cookie,然后您可以从列表中 select 并单击按钮发送 AJAX 请求以获取该 cookie 的价值。

这就是我认为正在发生的事情:cookie 作为您的 apex 应用程序调用的 http 请求 header 的一部分发送。其余调用是 另一个 http 请求,与您的顶级 http 请求无关,我认为该请求的 header 不包含 cookie。因此,在作为您的休息请求的一部分创建的数据库 session 中,cookie 将不存在。您可以自己设置其余请求的 header 来解决此问题。

--更新-- 要检查可以读取哪些 cookie,请使用以下来源创建来源类型 pl/sql 的休息处理程序:

DECLARE
  l_names owa_cookie.vc_arr;
  l_vals owa_cookie.vc_arr;
  l_num_vals INTEGER;
BEGIN
    owa_cookie.get_all(
        names => l_names,
        vals => l_vals,
        num_vals => l_num_vals);
    APEX_JSON.open_array('cookies');        
    FOR r IN 1 .. l_names.COUNT LOOP
    APEX_JSON.open_object; -- {
    APEX_JSON.write('name', l_names(r));
    APEX_JSON.write('value', l_vals(r));
    APEX_JSON.close_object; -- } cookie
    END LOOP;
     APEX_JSON.close_array; -- ] cookies
END;

顶点用户名 cookie 不在该 cookie 列表中。我建议您在 apex 的 after-login 进程中创建自己的自定义 cookie。 我验证了在 apex 进程中使用以下代码设置的 cookie 被其余处理程序拾取(基于博客 https://www.apex-at-work.com/2012/05/apex-simple-cookie-example.html

begin
owa_util.mime_header('text/html', FALSE);
owa_cookie.send(
name => 'CUSTOM_USER_COOKIE',
value => :APP_USER,
expires => sysdate + 30 );

apex_util.redirect_url (
p_url => 'f?p=&APP_ID.:1:' || :SESSION,
p_reset_htp_buffer => false );
end;