0

私は非常に一貫性のない、本当に奇妙な問題に直面しています。Rails 3 アプリから数秒ごとに json を要求する 1 ページのアプリケーションがあります。サーバー側では、 を使用してブラウザーのセッション情報を保存しactive_record_storeます。

問題は、2 つのリクエスト間で、セッション情報がクリアされることがあるということです。ログの一部を次に示します。

Started GET "/channels/2/show_next_slide.json?current_slide_slot_id=1806" for 127.0.0.1 at 2013-10-11 11:35:10 +0200
Processing by ChannelsController#show_next_slide as 
  Parameters: {"current_slide_slot_id"=>"1806", "id"=>"2"}
******* Test=
******* Session ID=ff7010bb1db040b90caa965b7736ad25
...
******* Test=1806
******* Session ID=ff7010bb1db040b90caa965b7736ad25
Completed 200 OK in 148ms (Views: 3.3ms | ActiveRecord: 4.3ms)
127.0.0.1 GET /channels/2/show_next_slide.json?current_slide_slot_id=1806 200 OK ChannelsController#show_next_slide JSON 148.1 (DB 4.3, View 3.3) {"current_slide_slot_id"=>"1806", "id"=>"2"} {}


Started GET "/assets/plugins/w/101d.png" for 127.0.0.1 at 2013-10-11 11:35:14 +0200
Served asset /plugins/w/101d.png - 304 Not Modified (0ms)


Started GET "/assets/plugins/w/102n.png" for 127.0.0.1 at 2013-10-11 11:35:14 +0200
Served asset /plugins/w/102n.png - 304 Not Modified (0ms)


Started GET "/assets/plugins/w/103n.png" for 127.0.0.1 at 2013-10-11 11:35:14 +0200
Served asset /plugins/w/103n.png - 304 Not Modified (0ms)


Started GET "/assets/plugins/w/109.png" for 127.0.0.1 at 2013-10-11 11:35:14 +0200
Served asset /plugins/w/109.png - 304 Not Modified (0ms)


Started GET "/channels/2/show_next_slide.json?current_slide_slot_id=1806" for 127.0.0.1 at 2013-10-11 11:35:15 +0200
Processing by ChannelsController#show_next_slide as 
Parameters: {"current_slide_slot_id"=>"1806", "id"=>"2"}
******* Test=
******* Session ID=ff7010bb1db040b90caa965b7736ad25

application_controller内容をログに書き込むように before_filter と after_filter をセットアップしましたsession[:test]( として表示******* Test=)。ご覧のとおり、最初のリクエストは で終了しsession[:test]=1806ますが、次のリクエストsession[:test]は空です。これは時折発生します。常にではない。

ご覧のとおり、セッション ID は両方のリクエストで同じです。また、csrfトークンは問題なく渡されます。念のため無効protect_from_forgeryにしましたが、違いはありません。だから、それは問題ではないようです。

私が使用し、セッションで何かを行う唯一の他の「サードパーティコード」はDeviseです。そこで何かが起こっているのかもしれませんが、何も思いつきません...

ここで何が起こっているのか、誰にも手がかりがありますか?

追加情報

application_controller では、before_filter と after_filter の両方で次のメソッドを呼び出します。

def log_session_for_debugging
  logger.debug("******* Test=#{session[:test]}")
  logger.debug("******* Session ID=#{request.session_options[:id]}")
end

session[:test]show_next_slide コントローラー アクションの render コマンドの直前に値を割り当てます。

  respond_to do |format|
    format.json { 
      session[:test] = @slide_slot.to_param
      render :json => @slide_slot ? @slide_slot.as_json_with_slide_and_elements() : {} 
    }
  end
4

1 に答える 1

0

問題の正確な原因はわかりませんでしたが、特定の役割を持つユーザーが別の方法でログインできるようにするコードが少しありました。そのために Warden レベルのコードを使用していました。私は追加のDevise戦略を使用することに切り替えました(この素晴らしい記事に従って)、それにより問題は解消されました。

于 2013-10-14T07:15:16.960 に答える