Oracle Apex 中“无法找到应用程序中项目的项目 ID”如何解决?

问题描述 投票:0回答:3

我有一个使用 Apex 21.1.3 制作的公共网站。

当用户分享我网站的页面时,比如说在 Facebook 上,Facebook 会在 URL 中添加

"?fbclickId=something"

我的应用程序崩溃并说:

无法在应用程序中找到项目 fbclickId 的项目 ID。

Apex 认为用户正在尝试设置应用程序中不存在的元素。

我有一个使用 htaccess 的 URL 处理层,可以在将 URL 发送到反向代理中的 Apex 之前对其进行格式化。我可以说让我们忽略问号“?”之后的所有内容。但在这种情况下,我也无法设置任何应用程序项目值。所以这是不可能的。

如何让 Apex 忽略设置不存在的参数?

以谷歌为例:

此 URL

https://www.google.com/?anyparameter=anyvalue
将始终解析为
https://www.google.com

oracle oracle-apex
3个回答
0
投票

我不知道有什么方法可以忽略无效参数,但您可以使错误对最终用户来说更好一点。

  1. 创建自定义 apex 错误处理函数。与标准错误处理的唯一区别是代码为 WWV_FLOW.FIND_ITEM_ID_ERR 的错误具有自定义消息并且没有附加信息。将字符串“无效的网址参数”更改为与您的业务案例更相关的内容。
create or replace function apex_error_custom
    (
      p_error IN apex_error.t_error 
    )
    RETURN apex_error.t_error_result
IS
    l_result          apex_error.t_error_result := apex_error.t_error_result();
BEGIN 
     
    l_result := apex_error.init_error_result ( p_error => APEX_ERROR_CUSTOM.p_error );

    IF p_error.apex_error_code = 'WWV_FLOW.FIND_ITEM_ID_ERR' THEN
      l_result.message := 'Invalid url arguments';
      l_result.additional_info := NULL;
    END IF;

    RETURN l_result;
END apex_error_custom;

  1. 更改应用程序定义以使用新的错误函数: 应用程序定义 > 错误处理 > 自定义错误函数。请注意,这会影响应用程序中的所有错误。
  2. 使错误变得更好的另一种方法是更改默认错误页面以使用定义的模板(共享组件>主题>您的主题>组件默认值>错误页面)。请注意,这会影响应用程序中的所有错误。

0
投票

这是我想出的解决方案。

我找不到任何方法来忽略不可用的字段,但找到了一个技巧来避免将它们发送到 Apex,从而避免了错误。

在中间层(nginx、apache、IIS)添加以下逻辑:

  • 只要有两个问号,请忽略第二部分:

     For example   : someApexAppUrl?Parameter=value?fbclickid=something
     Should become : someApexAppUrl?Parameter=value
    
  • 例如每当 url 添加参数时

     someApexAppUrl?Parameter=value
    

检查参数名称

  • 保护级别为无限制、需要校验和 - 应用程序级别、需要校验和 - 用户级别、需要校验和 - 会话级别

    的应用程序项目
  • 默认 Apex url 参数的硬编码列表,其中:session、request、clear、debug、printerFriendly、trace、timezone、lang、territory、cs、dialogCs、x01根据此文章

  • 具有名称模式的应用程序页面项目P99_Someting

当参数不属于这三类时,请忽略它并且不要将其发送到 Apex。这样,即使 facebook 添加了类似 ?fbclickid=xxx 的内容,Apex 应用程序仍然可以很好地工作。


0
投票

您可以将该项目添加到您的应用程序中以避免收到此错误消息。

创建一个名为

FBCLICKID
的应用程序项(在共享组件下)。将其会话状态保护设置为无限制。

© www.soinside.com 2019 - 2024. All rights reserved.