如何在Apex中避免会话无效时出现success message checksum content error
可行解决方案
方案1:自定义错误处理器中直接重定向(你原本的思路完全可用)
Apex的自定义错误处理逻辑支持返回重定向响应,操作步骤如下:
- 进入应用的「共享组件」-「错误处理」配置页,创建/修改自定义错误处理函数
- 在函数中判断错误码是否为
apex.success_msg.checksum_content_error - 匹配后执行重定向逻辑:获取当前请求的URL,剥离
success_msg及相关校验参数,使用apex_util.redirect_url方法跳转到清理后的URL - 记得设置错误处理函数的返回状态为跳过默认错误提示
示例代码片段参考:
FUNCTION apex_error_handler (p_error IN apex_error.t_error) RETURN apex_error.t_error_result IS l_result apex_error.t_error_result; l_clean_url VARCHAR2(4000); BEGIN l_result := apex_error.init_error_result(p_error => p_error); IF p_error.error_code = 'apex.success_msg.checksum_content_error' THEN -- 剥离URL中的success_msg参数及对应的校验签名参数 l_clean_url := apex_util.prepare_url( p_url => regexp_replace(owa_util.get_cgi_env('QUERY_STRING'), '&?success_msg=[^&]*(&success_msg_cs=[^&]*)?', ''), p_checksum_type => 'SESSION' ); apex_util.redirect_url(p_url => l_clean_url); -- 终止后续错误处理逻辑 apex_application.stop_apex_engine; END IF; RETURN l_result; END apex_error_handler;
方案2:从根源避免success_msg参数被用户书签留存
不要通过URL携带一次性成功提示,改用会话级别的临时变量存储提示信息,完全规避问题:
- 页面2保存成功后,不要在跳转URL中加
success_msg参数,而是用apex_util.set_session_state把提示内容存到一个仅当前会话有效的页面项/应用项里,比如P1_SUCCESS_MSG - 跳转回页面1后,页面1加载时判断
P1_SUCCESS_MSG是否有值,有值就展示成功提示,展示后立刻调用apex_util.set_session_state('P1_SUCCESS_MSG', null)清空值 - 这种方式下URL不会携带任何一次性参数,用户收藏的就是纯净的页面1地址,不会触发后续校验错误
方案3:配置页面参数白名单过滤
进入页面1的属性配置,找到「可接受的参数」设置,仅加入你需要的业务参数,把success_msg、success_msg_cs这类一次性提示参数排除在白名单外,Apex会自动忽略不在白名单内的URL参数,也不会触发后续的校验逻辑。
内容的提问来源于stack exchange,提问作者eaolson
相关产品推荐
相关产品推荐

