Class: AlSession
- Inherits:
-
Object
- Object
- AlSession
- Defined in:
- lib/al_session.rb,
lib/al_session_rdb.rb
Overview
セッションマネージャ セッション変数を管理する。
セッション変数には、String,Numeric,Hashなど、基本的な(requreの必要のない) オブジェクトのみ保存すること。 実装上は任意のオブジェクトが保存できるが、セッション復帰が難しくなる。 また、アプリケーション側にとっても、アプリケーションのバージョンアップが 難しくなるので、基本オブジェクトに限定したほうが良い。 コントローラを使う場合は、コントローラローカルセッションも参照の事。
Constant Summary collapse
- TBL_SESSIONS =
セッションを保存するテーブル名
"sessions"
- @@session_id =
セッションID
nil
- @@session_var =
セッション変数のHash
{}
- @@session_var_hash =
セッション変数のHashが更新されたかの確認用
nil
- @@session_file =
保存ファイルオブジェクト
nil
- @@session_rdbw =
保存RDBWオブジェクト
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
セッション変数の取得
209 210 211 |
# File 'lib/al_session.rb', line 209 def self.[]( k ) return @@session_var[k.to_sym] end |
.[]=(k, v) ⇒ Object
セッション変数の設定
220 221 222 |
# File 'lib/al_session.rb', line 220 def self.[]=( k, v ) @@session_var[k.to_sym] = v end |
._end ⇒ Object
終了処理(内部メソッド)
セッションの終了ではなく、htmlの接続ごとの終了。
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/al_session.rb', line 126 def self._end() # # ファイルに、セッション変数を書き出す。 # (note) # ロック解除は、close()に任せること。 if @@session_file if @@session_var.hash() != @@session_var_hash @@session_file.flock( File::LOCK_EX ) @@session_file.seek( 0, IO::SEEK_SET ) @@session_file.truncate( 0 ) @@session_file.write( Marshal.dump( @@session_var ) ) end @@session_file.close() end # # 古いセッション情報を消去するか判断 # (note) # STRATEGY: マーカファイルを作っておき、その作成日付を元に、 # 消去処理を動作させるか否かを判断する。 # nowtime = Time.now begin mtime = File.mtime( File.join( AL_SESS_DIR, "ALSESS_TIMEOUT_MARKER" ) ) return if (nowtime - mtime) < (AL_SESS_TIMEOUT / 2) rescue # nothing to do end File.open( File.join( AL_SESS_DIR, "ALSESS_TIMEOUT_MARKER" ), 'w' ) {} # # 古いセッション情報ファイルを消去 # Dir.glob( File.join( AL_SESS_DIR, "ALSESSID_*" ) ).each do |file| mtime = File.mtime( file ) if (nowtime - mtime) > AL_SESS_TIMEOUT File.unlink( file ) rescue 0 end end end |
._start ⇒ Object
セッション開始(内部メソッド)
当ファイルをインクルードした段階で自動スタートするので、 明示的に呼び出す必要は無い。
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/al_session.rb', line 81 def self._start() @@session_id = Alone::( :ALSESSID ) # # すでにセッションIDが割り当て済みの場合 # if /\A[a-zA-Z0-9]{32}\Z/ =~ @@session_id begin @@session_file = open( "#{AL_SESS_DIR}ALSESSID_#{@@session_id}", 'r+' ) AlSession.load() return rescue # ファイルが何らかの理由により、存在しない。 # よって、セッションID未割り当ての場合と同じ処理へ移行する。 end end # # セッションID未割り当ての場合 # retry_count = 0 begin @@session_id = make_session_id() @@session_file = open( "#{AL_SESS_DIR}ALSESSID_#{@@session_id}", File::RDWR|File::CREAT|File::EXCL ) Alone::( :ALSESSID, @@session_id, nil, '/', "HttpOnly" ) rescue retry_count += 1 if retry_count > 10 puts "Can't create session file. Fix an AL_SESS_DIR parameter in al_config.rb file." exit end retry end end |
.change_session_id ⇒ Object
セッションIDの変更
任意のタイミングで現在のセッションIDを無効化、新しいIDを付与する。
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/al_session.rb', line 175 def self.change_session_id() # # 今のセッションファイルを無効化(消去) # @@session_file.close() File.unlink( File.join( AL_SESS_DIR, "ALSESSID_#{@@session_id}" ) ) # # 新しいセッションidおよびファイルを作る # retry_count = 0 begin @@session_id = make_session_id() @@session_file = File.open( File.join( AL_SESS_DIR, "ALSESSID_#{@@session_id}" ), File::RDWR|File::CREAT|File::EXCL ) Alone::( :ALSESSID, @@session_id, nil, '/', "HttpOnly" ) rescue retry_count += 1 if retry_count > 10 raise "Can't create session file." end retry end end |
.debug_dump ⇒ String
デバッグ用:セッション変数をすべて出力する。
55 56 57 58 59 60 61 62 |
# File 'lib/al_session.rb', line 55 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
セッション変数の消去
240 241 242 |
# File 'lib/al_session.rb', line 240 def self.delete( k ) @@session_var.delete( k.to_sym ) end |
.delete_all ⇒ Object
セッション変数の全消去
248 249 250 |
# File 'lib/al_session.rb', line 248 def self.delete_all() @@session_var.clear() end |
.destroy ⇒ Object
セッションの終了
セッションそのものを終了する。 セッション変数もセッションIDも(クッキーも)消去する。
260 261 262 263 264 265 |
# File 'lib/al_session.rb', line 260 def self.destroy() delete_all() Alone::( :ALSESSID, '/' ) File.unlink( File.join( AL_SESS_DIR, "ALSESSID_#{@@session_id}" ) ) @@session_id = nil end |
.get_session_id ⇒ String
セッションIDの取得
69 70 71 |
# File 'lib/al_session.rb', line 69 def self.get_session_id() return @@session_id end |
.keys ⇒ Array<Symbol>
セッション変数のキー一覧
230 231 232 |
# File 'lib/al_session.rb', line 230 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 |