【问题标题】:Setting Session State - APEX 21.1设置会话状态 - APEX 21.1
【发布时间】:2021-07-26 13:11:34
【问题描述】:

根据我遇到的文档和示例,似乎在页面之间设置/传递会话状态的方法是通过 URL。这让我想到,直接从不同页面引用页面项目可以吗?或者,这样做的不利之处是 APEX 新手(比如我)最初可能没有意识到的。

例如:

  • 有一个应用程序有两个页面PAGE 1PAGE 2
  • PAGE 1 设置P1_SOME_VALUE = 'GREEN'P1_SOME_VALUE 现在处于会话状态)
  • PAGE 2 需要访问 P1_SOME_VALUE 的值

是否有任何理由不在设置P2_SOME_VALUE = :P1_SOME_VALUEPAGE 2 上设置BEFORE HEADER 计算? (假设P1_SOME_VALUE 是给定的,在PAGE 2 的会话中始终可用)

如果从PAGE 1PAGE 2 是使用超链接完成的,那么我知道使用我见过的 REDIRECT URL 属性方法设置会话状态更容易。我在我的应用程序中遇到了这样一种情况,即在一系列动态操作之后动态生成 URL,并且使用 BEFORE HEADER 计算似乎是我给定情况的更清洁/更简单的解决方案。只是想确保我没有忽略任何东西。

【问题讨论】:

    标签: oracle-apex


    【解决方案1】:

    您描述的行为,使用从另一个页面引用页面项目的 pl/sql 进程可以正常工作,但有一些事情需要考虑。不确定此列表是否详尽,其他人可能会发表评论:

    • 就个人而言,我尽量避免引用页面内其他页面上的项目,因为这会使开发变得更加困难 - 在页面 x 上工作时,您通常会搜索仅在页面内出现的项目。如果在其他页面上出现,则应用程序变得不那么干净。我尝试将此作为最佳实践。应用程序越干净,维护就越容易。两年后,当您必须在此应用中工作时,您将不会记得第 2 页上引用了 P1_SOME_VALUE。或者其他开发此应用的开发人员会永远恨您 ;)
    • 这可能会使调试变得更加困难。假设页面是通过将“清除页面缓存”选项设置为“页面 1”的 url 或分支访问的,那么 P1_SOME_VALUE 的值将被清除,因为该项目是在页面 1 上定义的。调试此问题将是挑战。
    • 在 url 中传递一个值是非常安全的。如果您使用校验和,则用户无法手动操作页面项的值。
    • 请注意,页面的 DOM 仅包含在该页面上定义的页面项目。这意味着您不能在第 2 页上使用引用 P1_SOME_VALUE 的 javascript 或在第 2 页上使用 javascript 设置 P1_SOME_VALUE 的值。这在您的用例中并不重要。

    在另一个页面中引用页面项目而不是它们所属页面的另一种方法是将数据存储在一个集合中 - 该集合将在会话期间存在。

    【讨论】:

    • 谢谢,这是有道理的。我上面的示例是否可以很好地用于 APPLICATION_ITEM (设置在一个页面上,但可以在其他页面上使用)?我将阅读有关收藏的信息。集合是 APEX API 吗?
    • 一般来说,使用 url 是可行的方法。应用程序项也可以工作,请注意这也不在 DOM 中。 APEX_COLLECTIONS 是一个 pl/sql API:docs.oracle.com/en/database/oracle/application-express/21.1/…
    • 我最初使用的是 URL,但共享的值是“临时 pswd”,建议不要通过 url 传递此类信息。 PAGE 2 是一个确认页面,让用户现在他们的密码已被重置。
    • 为什么要将如此敏感的数据点的值传递给另一个页面?在第 1 页执行一个页面进程来存储密码并让用户知道密码已在第 2 页更改。不要费心显示它 - 我从未见过确认“成功将您的密码更改为 foobar”:)跨度>
    • 理解并同意 100%,但客户要求我努力切换的手动过程 - 建议通过添加一个在重置密码页面过程完成后发送电子邮件的过程来自动化它。无论如何,我很欣赏你的洞察力......
    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2022-10-21
    • 2019-06-17
    相关资源
    最近更新 更多