PL/SQL Web Toolkit应用从Apache/mod_plsql迁移至Tomcat/ORDS后登出异常
解决ORDS环境下PL/SQL Web Toolkit应用的登出问题
核心思路
ORDS不兼容mod_plsql的logmeoff函数,需要通过销毁ORDS会话Cookie + 清除数据库会话状态的组合方式实现登出。
具体实现方案
1. 销毁ORDS会话Cookie
ORDS默认使用名为ORA_WWV_APP_<APP_ID>的Cookie(APP_ID是你的应用ID,可通过OWA_UTIL.GET_CGI_ENV('SCRIPT_NAME')提取,或直接查看浏览器Cookie)。在PL/SQL中通过OWA_COOKIE.REMOVE删除该Cookie:
BEGIN -- 删除ORDS会话Cookie,替换<APP_ID>为实际应用ID,或动态获取 OWA_COOKIE.REMOVE(NAME => 'ORA_WWV_APP_' || <APP_ID>, DOMAIN => '<你的域名>', PATH => '/ords'); END;
如果不确定APP_ID,也可以动态获取当前应用的Cookie名称:
DECLARE l_cookie_name VARCHAR2(100); BEGIN l_cookie_name := OWA_UTIL.GET_CGI_ENV('HTTP_COOKIE'); -- 提取ORA_WWV_APP开头的Cookie名称 l_cookie_name := REGEXP_SUBSTR(l_cookie_name, 'ORA_WWV_APP_\d+'); IF l_cookie_name IS NOT NULL THEN OWA_COOKIE.REMOVE(NAME => l_cookie_name, DOMAIN => '<你的域名>', PATH => '/ords'); END IF; END;
2. 清除数据库会话状态
调用OWA_SESSION.DESTROY清除当前PL/SQL会话的所有状态变量:
BEGIN OWA_SESSION.DESTROY; END;
这会重置当前会话的所有用户自定义状态,相当于mod_plsql中logmeoff的部分功能。
3. 完整登出PL/SQL示例
将上述两步结合,创建一个自定义的登出函数:
CREATE OR REPLACE PROCEDURE custom_logout IS l_cookie_name VARCHAR2(100); l_domain VARCHAR2(100) := 'yourdomain.com'; -- 替换为实际域名 l_path VARCHAR2(50) := '/ords'; -- ORDS访问路径 BEGIN -- 1. 动态获取并删除ORDS会话Cookie l_cookie_name := OWA_UTIL.GET_CGI_ENV('HTTP_COOKIE'); l_cookie_name := REGEXP_SUBSTR(l_cookie_name, 'ORA_WWV_APP_\d+'); IF l_cookie_name IS NOT NULL THEN OWA_COOKIE.REMOVE(NAME => l_cookie_name, DOMAIN => l_domain, PATH => l_path); END IF; -- 2. 清除数据库会话状态 OWA_SESSION.DESTROY; -- 3. 重定向到登录页面(可选) OWA_UTIL.REDIRECT_URL('login_page.plsql'); END; /
4. 额外注意事项
- 如果你的应用使用了自定义会话管理(比如自己维护的会话表),需要在登出时手动删除对应会话记录。
- 测试时务必清除浏览器缓存和Cookie,避免旧会话残留。
- ORDS的会话超时可通过ORDS配置文件调整,路径为
ords/conf/ords_defaults.xml,修改<session-timeout>参数(单位分钟)。
内容的提问来源于stack exchange,提问作者tale852150
相关产品推荐
相关产品推荐

