当前位置:首页 > 网站旧栏目 > 学习园地 > 设计软件教程 > 每天一剂Rails良药之Keep An Eye On Your Session Expiry

每天一剂Rails良药之Keep An Eye On Your Session Expiry
2010-01-14 07:05:17  作者:  来源:
Rails的session默认为当用户关闭浏览器时终止
我们可以在config/environment.rb里设置它:
Java代码 复制代码
  1. CGI::Session.expire_after 1.month  

这需要一个插件,具体session设置请参考http://wiki.rubyonrails.org/rails/pages/HowtoChangeSessionOptions
这不是今天我们讨论的重点

出于安全问题,有时候我们需要通知用户你的session快超时了,如在线银行系统等
让我们看看在Rails里怎样做

1,bank_account_controller.rb
Java代码 复制代码
  1. class BankAccountController < ApplicationController   
  2.   before_filter :update_activity_time, :except => :session_expiry   
  3.   def update_activity_time   
  4.     session[:expires_at] = 1.minutes.from_now   
  5.   end   
  6.      
  7.   def session_expiry   
  8.     @time_left = (session[:expires_at] - Time.now).to_i   
  9.     unless @time_left > 0  
  10.       reset_session   
  11.       render '/signin/redirect'  
  12.     end   
  13.   end   
  14. end  

该controller里定义了update_activity_time这个before_filter,它设置session的超时时间,这里为了demo我们设置为1分钟

2,bank_account/index.rhtml
Java代码 复制代码
  1. <html>   
  2.     <head>   
  3.         <%= javascript_include_tag :defaults %>   
  4.     </head>   
  5.     <body>   
  6.         <div id='header'></div>   
  7.         <%= periodically_call_remote :url => {   
  8.                 :action => 'session_expiry'},   
  9.                 :frequency => 1,   
  10.                 :update => 'header' %>   
  11.         <div id='body'>Here's where your application's real functionality goes.</div>   
  12.     </body>   
  13. </html>  

我们使用periodically_call_remote这个helper方法来每间隔1秒远程调用一次session_expiry这个action,并更新header这个div

3,bank_account/session_expiry.rhtml
Java代码 复制代码
  1. <span style='color: read; font-weight: bold'>   
  2.     Your session will expire in <%= @time_left %> seconds   
  3. </span>  

这里显示了我们的session还有多久会expire

4,signin/redirect.rjs
Java代码 复制代码
  1. page << "window.location = '#{signin_url}';"  

我们在session超时的时候自动redirect到signin_url(需要我们在routes.rb里定义)

安徽新华电脑学校专业职业规划师为你提供更多帮助【在线咨询