ORACLE APEX 国内用的人真少,但恰好我们公司用了一下,国内资料非常少啊,哈哈,本来自动登录对于一般的web开发很简单啊,不如javaweb,就一小段段代码,嘿嘿!但对于ORACLE APEX 来说就不是很容易,首先,是我才用了两个月不到,其次,5.1的桌面版还有个bug,不能设置不了cookie。官方有补丁,但没support账号,补丁打不了,翻遍国内外资料找到了一篇自动登录的博客:http://rokitta.blogspot.fr/2012/10/remember-me-apex-autologin.html.不过不一样和我的。好在5.1的移动应用没有bug所以我用移动版做了个验证系统。我技术很烂,写博客是为自己做个笔记,其次也可能有需要的朋友,还可能让大家多指点指点。如果不喜欢,可以不看。看了别喷。我怕。好了,不多说了。开始正题。
step_1:下面两个系统,一个主系统,一个验证系统
step_2:在验证系统的登录页设置已复选框返回值为 Y 代表一个月内自动登录。
step_3:登录处理是进行如下出处理,如果自动登录选中,则保存 REMEMBER_ME 有效期30天 ,否则,浏览器关闭时REMEMBER_ME失效。其次保存用户名和密码提供给主系统登录。在这里保存在保存在 REMEMBER_ME_P中的是用md5加密过的 一串十六进制字符。
如下是进行cookie设置的代码
DECLARE
V_COOKIE VARCHAR2(4000);
username_u varchar2(100);
count_u number;
BEGIN
IF :p101_remember = 'Y' THEN
OWA_UTIL.mime_header ('text/html', FALSE);
OWA_COOKIE.send (name => 'REMEMBER_ME',
VALUE =>'Y',
expires => SYSDATE + 30);
ELSE
OWA_UTIL.mime_header ('text/html', FALSE);
OWA_COOKIE.send (name => 'REMEMBER_ME',
VALUE =>'Y');
-- expires => SYSDATE + 30);
END IF;
OWA_UTIL.mime_header ('text/html', FALSE);
OWA_COOKIE.send (name => 'REMEMBER_ME_U',
VALUE =>:P101_USERNAME,
expires => SYSDATE +30);
--查询该用户是否已存在表中
select count(*) into count_u from DONOR_USER_PASSWORD where username=upper(:P101_USERNAME);
if count_u=0 then
insert into DONOR_USER_PASSWORD values(upper(:P101_USERNAME),:P101_PASSWORD,donor_md5(upper(:P101_USERNAME)));
COMMIT;
else
select username into username_u from DONOR_USER_PASSWORD where username=upper(:P101_USERNAME);
--更新密码
update DONOR_USER_PASSWORD set password_d=:P101_PASSWORD where username=username_u;
commit;
end if;
SELECT md5 into V_COOKIE from DONOR_USER_PASSWORD where username=upper(:P101_USERNAME);
--设置用户名密码
OWA_UTIL.mime_header ('text/html', FALSE);
OWA_COOKIE.send (name => 'REMEMBER_ME_P',
VALUE =>V_COOKIE,
expires => SYSDATE +30);
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
apex_error.add_error (
p_message => '设置cookie出错!'||count_u,
p_display_location => apex_error.c_on_error_page );
END;
--apex_authentication.send_login_username_cookie (p_username => LOWER (:p101_username));
这里设计了一张表 把用户名用MD5进行加密和用户名密码一起插入表中,为了根据这串加密字符查询密码。表如下:
cookie设置好之后,进行登录,如下登录代码:
apex_authentication.login(
p_username =>
:P101_USERNAME,
--'user_tgw',
p_password =>
--'a123456'
:P101_PASSWORD
);
登陆之后,到达登录系统的主页,在登陆了系统的主页通过js跳转到主系统登录页,如下js跳转代码:
如下登录系统登录页,在登录页上只有如下处理。
如下是处理代码:
declare
remember varchar2(4);
username varchar2(400);
password_p varchar2(400);
u_md5 varchar2(1000);
begin
remember := apex_authentication.get_login_username_cookie('REMEMBER_ME');
username := apex_authentication.get_login_username_cookie('REMEMBER_ME_U');
u_md5 := apex_authentication.get_login_username_cookie('REMEMBER_ME_P');
--判断用户名密码cookie是否为空
if u_md5 is not null and username is not null then
--判断是否为空,非空说明自动登录
if remember is not null then
select password_d into password_p from DONOR_USER_PASSWORD where md5 = u_md5;
--让系统自动登录
wwv_flow_custom_auth_std.post_login (p_uname => username,
p_password => password_p,
p_session_id => :app_session,
p_flow_page => :app_id || ':1');
else
--如果为空 则重定向到 登录页进行验证
apex_util.redirect_url('f?p=109:101');
end if;
else
apex_util.redirect_url('f?p=109:101');
end if;
--异常处理
exception
when no_data_found then
apex_util.redirect_url('f?p=109:101');
when others then
apex_util.redirect_url('f?p=109:101');
end;
如上,通过判断用户cookie信息来决定用户是否已验证和是否自动登录。如果三条cookie信息都有直接让用户自动登录。如果有username和md5则说明用户上次未选择自动登录。那么跳转到验证系统登录页进行验证。如果三条信心都没有,则说明第一次登录 ,或距离上一次自动登录已30天,则跳转到验证页面。
在这里系统的主链接是主系统的主页。设置会话状态无效是指向本登录页。用户首先登陆系统,会话是无效的,就会转到此页,转到此页后,就会进行如上处理。用户每次登陆都需需要经过此页处理。根据此页判断就可以决定用户是否自动登录。
step_4 注销:所有注销操作都指向一个页面,在这里叫注销页面,在此页面上进行如下处理:
OWA_UTIL.mime_header('text/html', FALSE);
OWA_COOKIE.remove(name => 'REMEMBER_ME', val => NULL);
OWA_COOKIE.remove(name => 'REMEMBER_ME_U', val => NULL);
OWA_COOKIE.remove(name => 'REMEMBER_ME_P', val => NULL);
APEX_authentication.LOGOUT(
:SESSION_ID,
:APP_ID,
NULL);
如上也就是清除所有cookie,然后进行注销。
不好意思,临近下班,乱七八糟的写。哈哈哈,不过也没人看吧,因为99.9%的人都不知道,oracle APEX是啥!如果有人刚好看了
抱歉,哈哈!