oracle APEX5.1 自动登录

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是啥!如果有人刚好看了

抱歉,哈哈!

 

你可能感兴趣的:(oracle,APEX)