Class: AlSession

Inherits:
Object
  • Object
show all
Defined in:
lib/al_session.rb,
lib/al_session_rdb.rb

Overview

Note:

セッションマネージャ セッション変数を管理する。

セッション変数には、String,Numeric,Hashなど、基本的な(requreの必要のない) オブジェクトのみ保存すること。 実装上は任意のオブジェクトが保存できるが、セッション復帰が難しくなる。 また、アプリケーション側にとっても、アプリケーションのバージョンアップが 難しくなるので、基本オブジェクトに限定したほうが良い。 コントローラを使う場合は、コントローラローカルセッションも参照の事。

See Also:

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

Class Method Details

.[](k) ⇒ Object

セッション変数の取得

Parameters:

  • k (String, Symbol)

    セッション変数名 key

Returns:

  • (Object)



209
210
211
# File 'lib/al_session.rb', line 209

def self.[]( k )
  return @@session_var[k.to_sym]
end

.[]=(k, v) ⇒ Object

セッション変数の設定

Parameters:

  • k (String, Symbol)

    セッション変数名 key

  • v (Object)



220
221
222
# File 'lib/al_session.rb', line 220

def self.[]=( k, v )
  @@session_var[k.to_sym] = v
end

._endObject

Note:

終了処理(内部メソッド)

セッションの終了ではなく、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

._startObject

Note:

セッション開始(内部メソッド)

当ファイルをインクルードした段階で自動スタートするので、 明示的に呼び出す必要は無い。



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::get_cookie( :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::set_cookie( :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_idObject

Note:

セッション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::set_cookie( :ALSESSID, @@session_id, nil, '/', "HttpOnly" )

  rescue
    retry_count += 1
    if retry_count > 10
      raise "Can't create session file."
    end
    retry
  end
end

.debug_dumpString

デバッグ用:セッション変数をすべて出力する。

Returns:

  • (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

セッション変数の消去

Parameters:

  • k (String, Symbol)

    セッション変数名 key



240
241
242
# File 'lib/al_session.rb', line 240

def self.delete( k )
  @@session_var.delete( k.to_sym )
end

.delete_allObject

セッション変数の全消去



248
249
250
# File 'lib/al_session.rb', line 248

def self.delete_all()
  @@session_var.clear()
end

.destroyObject

Note:

セッションの終了

セッションそのものを終了する。 セッション変数もセッションIDも(クッキーも)消去する。



260
261
262
263
264
265
# File 'lib/al_session.rb', line 260

def self.destroy()
  delete_all()
  Alone::delete_cookie( :ALSESSID, '/' )
  File.unlink( File.join( AL_SESS_DIR, "ALSESSID_#{@@session_id}" ) )
  @@session_id = nil
end

.get_session_idString

セッションIDの取得

Returns:

  • (String)

    セッションID



69
70
71
# File 'lib/al_session.rb', line 69

def self.get_session_id()
  return @@session_id
end

.keysArray<Symbol>

セッション変数のキー一覧

Returns:

  • (Array<Symbol>)

    キーの配列



230
231
232
# File 'lib/al_session.rb', line 230

def self.keys()
  return @@session_var.keys()
end

.loadObject

Note:

セッション変数の読み込み 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

Note:

セッション変数の選択的保存 COMETなどで非常に長くセッションが続く場合に、自分が行った変更を 一旦コミットしたい場合に使うことができる。

Parameters:

  • keys (Array<Symbol>)

    保存対象



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