Class: AlSession
- Inherits:
-
Object
- Object
- AlSession
- Defined in:
- lib/al_session_rdb.rb,
lib/al_session.rb
Overview
セッションマネージャセッション変数を管理する。
セッション変数には、String,Numeric,Hashなど、基本的な(requreの必要のない)オブジェクトのみ保存すること。実装上は任意のオブジェクトが保存できるが、セッション復帰が難しくなる。また、アプリケーション側にとっても、アプリケーションのバージョンアップが難しくなるので、基本オブジェクトに限定したほうが良い。コントローラを使う場合は、コントローラローカルセッションも参照の事。
Constant Summary collapse
- TBL_SESSIONS =
セッションを保存するテーブル名
"sessions"- @@session_id =
セッションID
nil- @@session_var =
セッション変数のHash
{}
- @@session_rdbw =
保存RDBWオブジェクト
nil- @@session_var_hash =
セッション変数のHashが更新されたかの確認用
nil- @@session_file =
保存ファイルオブジェクト
nil
Class Method Summary collapse
-
.[](k) ⇒ Object
セッション変数の取得.
-
.[]=(k, v) ⇒ Object
セッション変数の設定.
-
._end ⇒ Object
終了処理(内部メソッド).
-
._start ⇒ Object
セッション開始(内部メソッド).
-
.change_session_id ⇒ Object
セッションIDの変更.
-
.debug_dump ⇒ String
デバッグ用:セッション変数をすべて出力する。.
-
.delete(k) ⇒ Object
セッション変数の消去.
-
.delete_all ⇒ Object
セッション変数の全消去.
-
.destroy ⇒ Object
セッションの終了.
-
.get_session_id ⇒ String
セッションIDの取得.
-
.keys ⇒ Array<Symbol>
セッション変数のキー一覧.
-
.load ⇒ Object
セッション変数の読み込み COMETなどで非常に長くセッションが続く場合に、ほかの接続から行われた セッション変数の変更を反映したい場合にも使うことができる。 自分が行った変更は破棄される。.
-
.save(*keys) ⇒ Object
セッション変数の選択的保存 COMETなどで非常に長くセッションが続く場合に、自分が行った変更を 一旦コミットしたい場合に使うことができる。.
Class Method Details
.[](k) ⇒ Object
セッション変数の取得
185 186 187 |
# File 'lib/al_session_rdb.rb', line 185 def self.[]( k ) return @@session_var[k.to_sym] end |
.[]=(k, v) ⇒ Object
セッション変数の設定
196 197 198 |
# File 'lib/al_session_rdb.rb', line 196 def self.[]=( k, v ) @@session_var[k.to_sym] = v end |
._end ⇒ Object
終了処理(内部メソッド)
セッションの終了ではなく、htmlの接続ごとの終了。
139 140 141 142 143 144 145 |
# File 'lib/al_session_rdb.rb', line 139 def self._end() # # DBへセッション変数を登録 # data = { :data=>Marshal.dump( @@session_var ).dump, :updated_at=>Time.now } @@session_rdbw.update( TBL_SESSIONS, data, {:session_id=>@@session_id} ) end |
._start ⇒ Object
セッション開始(内部メソッド)
当ファイルをインクルードした段階で自動スタートするので、明示的に呼び出す必要は無い。
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/al_session_rdb.rb', line 94 def self._start() @@session_rdbw = AlRdbw.connect( AL_SESS_CONN ) @@session_id = Alone::( :ALSESSID ) # # すでにセッションIDが割り当て済みの場合 # if /\A[a-zA-Z0-9]{32}\Z/ =~ @@session_id begin rows = @@session_rdbw.select( "select data from #{TBL_SESSIONS} where session_id='#{@@session_id}';" ) @@session_var = Marshal.load( eval( rows[0][:data] ) ) return rescue # データが何らかの理由により存在しないか、不正なデータである。 # よって、セッションID未割り当ての場合と同じ処理へ移行する。 end end # # セッションID未割り当ての場合 # retry_count = 0 begin @@session_id = make_session_id() @@session_rdbw.insert( TBL_SESSIONS, { :session_id=>@@session_id, :updated_at=>Time.now } ) Alone::( :ALSESSID, @@session_id, nil, '/', "HttpOnly" ) rescue retry_count += 1 if retry_count > 10 puts "Can't create session data in database. Fix AL_SESS_* parameter in al_config.rb file." exit end retry end end |
.change_session_id ⇒ Object
セッションIDの変更
任意のタイミングで現在のセッションIDを無効化、新しいIDを付与する。
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/al_session_rdb.rb', line 154 def self.change_session_id() # # 今のセッションファイルを無効化(消去) # @@session_rdbw.delete( TBL_SESSIONS, {:session_id=>@@session_id} ) # # 新しいセッションidおよびファイルを作る # retry_count = 0 begin @@session_id = make_session_id() @@session_rdbw.insert( TBL_SESSIONS, { :session_id=>@@session_id, :updated_at=>Time.now } ) Alone::( :ALSESSID, @@session_id, nil, '/', "HttpOnly" ) rescue retry_count += 1 if retry_count > 10 raise "Can't create session." end retry end end |
.debug_dump ⇒ String
デバッグ用:セッション変数をすべて出力する。
68 69 70 71 72 73 74 75 |
# File 'lib/al_session_rdb.rb', line 68 def self.debug_dump() r = "AlSession::debug_dump() outputs\n" r << "Session ID '#{get_session_id()}'\n" @@session_var.each do |k,v| r << "#{k} => '#{v.to_s}'\n" end return r end |
.delete(k) ⇒ Object
セッション変数の消去
216 217 218 |
# File 'lib/al_session_rdb.rb', line 216 def self.delete( k ) @@session_var.delete( k.to_sym ) end |
.delete_all ⇒ Object
セッション変数の全消去
224 225 226 |
# File 'lib/al_session_rdb.rb', line 224 def self.delete_all() @@session_var.clear() end |
.destroy ⇒ Object
セッションの終了
セッションそのものを終了する。セッション変数もセッションIDも(クッキーも)消去する。
236 237 238 239 240 241 |
# File 'lib/al_session_rdb.rb', line 236 def self.destroy() delete_all() Alone::( :ALSESSID, '/' ) @@session_rdbw.delete( TBL_SESSIONS, {:session_id=>@@session_id} ) @@session_id = nil end |
.get_session_id ⇒ String
セッションIDの取得
82 83 84 |
# File 'lib/al_session_rdb.rb', line 82 def self.get_session_id() return @@session_id end |
.keys ⇒ Array<Symbol>
セッション変数のキー一覧
206 207 208 |
# File 'lib/al_session_rdb.rb', line 206 def self.keys() return @@session_var.keys() end |
.load ⇒ Object
セッション変数の読み込みCOMETなどで非常に長くセッションが続く場合に、ほかの接続から行われたセッション変数の変更を反映したい場合にも使うことができる。自分が行った変更は破棄される。
275 276 277 278 279 280 281 |
# File 'lib/al_session.rb', line 275 def self.load() @@session_file.flock( File::LOCK_SH ) @@session_file.seek( 0, IO::SEEK_SET ) @@session_var = Marshal.load( @@session_file.read() ) rescue {} @@session_file.flock( File::LOCK_UN ) @@session_var_hash = @@session_var.hash() end |
.save(*keys) ⇒ Object
セッション変数の選択的保存COMETなどで非常に長くセッションが続く場合に、自分が行った変更を一旦コミットしたい場合に使うことができる。
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 |
# File 'lib/al_session.rb', line 291 def self.save( *keys ) @@session_file.flock( File::LOCK_EX ) @@session_file.seek( 0, IO::SEEK_SET ) new_vars = Marshal.load( @@session_file.read() ) rescue {} keys.each { |key| new_vars[key.to_sym] = @@session_var[key.to_sym] } @@session_var = new_vars @@session_file.seek( 0, IO::SEEK_SET ) @@session_file.truncate( 0 ) @@session_file.write( Marshal.dump( @@session_var ) ) @@session_file.fsync() @@session_file.flock( File::LOCK_UN ) @@session_var_hash = @@session_var.hash() end |