Oracle APEX中如何动态设置LOGOUT_URL,实现不同用户登出跳转不同页面
Oracle APEX 动态设置不同用户类型的登出跳转URL
方法1:自定义登出按钮(推荐)
替代APEX默认登出组件,通过PL/SQL动态生成跳转地址:
- 第一步:创建应用项
P_USER_AUTH_TYPE,标记用户认证类型(如LOCAL=本地自定义认证,REMOTE=跨应用会话共享认证)- 本地认证:在自定义认证方案的Post-Authentication Procedure中添加代码:
APEX_UTIL.SET_SESSION_STATE('P_USER_AUTH_TYPE', 'LOCAL'); - 跨应用会话共享:在主应用的Session Initialization过程中判断会话来源并设置:
IF APEX_UTIL.GET_SESSION_ATTRIBUTE('APEX_SOURCE_APP_ID') IS NOT NULL THEN APEX_UTIL.SET_SESSION_STATE('P_USER_AUTH_TYPE', 'REMOTE'); END IF;
- 本地认证:在自定义认证方案的Post-Authentication Procedure中添加代码:
- 第二步:在全局页(Page 0)添加自定义登出按钮
- 按钮类型选PL/SQL Code
- 填写PL/SQL代码:
DECLARE l_next_url VARCHAR2(2000); BEGIN CASE :P_USER_AUTH_TYPE WHEN 'LOCAL' THEN l_next_url := 'f?p=' || :APP_ID || ':LOGIN:' || :SESSION || '::NO:::'; WHEN 'REMOTE' THEN l_next_url := 'f?p=123:LOGIN:' || :SESSION || '::NO:::'; -- 替换123为源应用ID END CASE; APEX_AUTH.LOGOUT( p_app_id => :APP_ID, p_session_id => :SESSION, p_next_url => l_next_url ); END; - 隐藏默认登出按钮:在应用导航栏设置中取消默认登出按钮的显示
方法2:修改认证方案的登出过程
针对不同认证方案配置专属登出逻辑:
- 本地自定义认证方案:
- 创建自定义登出存储过程:
CREATE OR REPLACE PROCEDURE LOCAL_USER_LOGOUT IS l_next_url VARCHAR2(2000); BEGIN l_next_url := 'f?p=' || v('APP_ID') || ':LOGIN:' || v('SESSION') || '::NO:::'; APEX_AUTH.LOGOUT( p_app_id => v('APP_ID'), p_session_id => v('SESSION'), p_next_url => l_next_url ); END; - 在认证方案的Logout Procedure字段中填写
LOCAL_USER_LOGOUT
- 创建自定义登出存储过程:
- 跨应用会话共享认证方案:
- 创建对应登出过程:
CREATE OR REPLACE PROCEDURE REMOTE_USER_LOGOUT IS l_next_url VARCHAR2(2000); BEGIN l_next_url := 'f?p=123:LOGIN:' || v('SESSION') || '::NO:::'; -- 替换为源应用ID APEX_AUTH.LOGOUT( p_app_id => v('APP_ID'), p_session_id => v('SESSION'), p_next_url => l_next_url ); END; - 在该认证方案的Logout Procedure字段中填写
REMOTE_USER_LOGOUT
- 创建对应登出过程:
方法3:前端动态修改默认登出链接(快速临时方案)
通过jQuery修改默认登出按钮的跳转地址,适合轻量场景:
- 在全局页(Page 0)创建Dynamic Action:
- 触发条件:Page Load
- 动作选Execute JavaScript Code
- 代码内容:
var authType = apex.item('P_USER_AUTH_TYPE').getValue(); var logoutUrl; if (authType === 'LOCAL') { logoutUrl = 'f?p=' + apex.app.getAppId() + ':LOGIN:' + apex.app.getSessionId() + '::NO:::'; } else if (authType === 'REMOTE') { logoutUrl = 'f?p=123:LOGIN:' + apex.app.getSessionId() + '::NO:::'; // 替换为源应用ID } $('a.t-Button--logout').attr('href', apex.server.url(logoutUrl, {}, {x01: 'LOGOUT'}));
- 注意:此方法依赖APEX前端组件类名,不同版本可能需要调整选择器
内容的提问来源于stack exchange,提问作者RussB
相关产品推荐
相关产品推荐

