Class: AlSession

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

Overview

Note:

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

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

See Also:

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

Class Method Details

.[](k) ⇒ Object

セッション変数の取得

Parameters:

  • k (String, Symbol)

    セッション変数名 key

Returns:

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

セッション変数の設定

Parameters:

  • k (String, Symbol)

    セッション変数名 key

  • v (Object)



196
197
198
# File 'lib/al_session_rdb.rb', line 196

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

._endObject

Note:

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

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

._startObject

Note:

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

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



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

Note:

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

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

.debug_dumpString

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

Returns:

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

セッション変数の消去

Parameters:

  • k (String, Symbol)

    セッション変数名 key



216
217
218
# File 'lib/al_session_rdb.rb', line 216

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

.delete_allObject

セッション変数の全消去



224
225
226
# File 'lib/al_session_rdb.rb', line 224

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

.destroyObject

Note:

セッションの終了

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



236
237
238
239
240
241
# File 'lib/al_session_rdb.rb', line 236

def self.destroy()
  delete_all()
  Alone::delete_cookie( :ALSESSID, '/' )
  @@session_rdbw.delete( TBL_SESSIONS, {:session_id=>@@session_id} )
  @@session_id = nil
end

.get_session_idString

セッションIDの取得

Returns:

  • (String)

    セッションID



82
83
84
# File 'lib/al_session_rdb.rb', line 82

def self.get_session_id()
  return @@session_id
end

.keysArray<Symbol>

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

Returns:

  • (Array<Symbol>)

    キーの配列



206
207
208
# File 'lib/al_session_rdb.rb', line 206

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