IT TIP

Rails가 Ajax 게시물에서 세션을 다시로드하지 않음

itqueen 2020. 11. 30. 20:30
반응형

Rails가 Ajax 게시물에서 세션을 다시로드하지 않음


jQuery를 사용하는 Rails 및 ajax에서 매우 이상한 문제가 발생했습니다 (jQuery에만 국한된 것은 아니라고 생각합니다).

내 Rails 애플리케이션은 쿠키 세션 저장소를 사용하며 세션에서 사용자 ID를 설정하는 매우 간단한 로그인이 있습니다. user_id가 세션에 설정되지 않은 경우 로그인 페이지로 리디렉션됩니다. 이것은 문제없이 작동합니다. JQuery GET 요청도 잘 작동합니다. 문제는 내가 jQuery POST를 수행 할 때입니다. 브라우저가 세션 쿠키를 확인 (Firebug로 확인하고 request.cookies를 로그에 덤핑하여 확인)했지만 세션이 비어 있습니다. 즉, 세션이 {}입니다.

내 application.js에서 이것을하고 있습니다.

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr('content');
  xhr.setRequestHeader('X-CSRF-Token', token);
});

내 샘플 게시물은 다음과 같습니다.

$.post('/test/1', { _method: 'delete' }, null, 'json');

이 컨트롤러 메서드 (_method : delete)에 도달해야합니다.

def destroy
  respond_to do |format|
    format.json { render :json => { :destroyed => 'ok' }.to_json }
  end
end

로그를보고 Firebug를 사용하여 ajax 게시물이 발생할 때 요청 헤더에 올바른 쿠키 값이 전송되는지 확인할 수 있지만 어떤 시점에서 Rails가이 값을 잃어 세션이 손실되어 로그인으로 리디렉션되는 것 같습니다. 페이지 및 메소드에 도달하지 않습니다.

나는 이것을 디버그하기 위해 생각할 수있는 모든 것을 시도했지만 이것이 Rails의 버그 일 수 있다는 생각을하고있다. 도움이된다면 Rails 3.0.4와 jQuery 1.5를 사용하고 있습니다. 정규 (즉, ajax가 아닌) 요청 받기 및 게시가 작동하고 ajax 요청이 문제없이 작동한다는 것은 매우 이상합니다. 그렇지 않은 것은 ajax 게시일뿐입니다.

이 문제를 해결하는 데 도움을 주시면 대단히 감사하겠습니다!

감사합니다,
Dave


나는 무슨 일이 일어나고 있는지 알아낼 수 있었기 때문에 내 질문에 답할 것입니다. 다른 사람에게 유용 할 수 있도록 여기에 게시하겠습니다!

자세히 조사한 후 CSRF 토큰으로 요청 헤더를 설정 해야하는 코드 가 그렇지 않다는 것을 알아 냈습니다 . 이것은 원래 코드입니다.

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr('content');
  xhr.setRequestHeader('X-CSRF-Token', token);
});

일어난 일은이 코드가 헤더를 설정하지 않았고, Rails가 Ajax 요청을 받고 있었고, 토큰이 일치하지 않았고 세션을 재설정하고 있다는 것입니다. 이것은 ActionController :: InvalidAuthenticityToken 오류를 발생시키는 데 사용되었습니다 (오류가 발생하면 이전에 이것을 잡았을 것입니다 ... 오 잘), Rails 3.0.4 이후 이제 조용히 세션을 재설정합니다.

따라서 헤더에 토큰을 보내려면 다음을 수행해야합니다 ( 이 놀라운 블로그 게시물 덕분에 많이 있습니다 ).

$.ajaxSetup({
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
  }
}); 

이제 모든 것이 정상적으로 작동합니다. 좋네요.


다른 사례를 찾았습니다.

애플리케이션 레이아웃 파일에 'csrf_meta_tag'를 설정 했습니까?

제 경우에는 그 태그를 설정하지 않았고 당신과 동일한 문제를 만났습니다.

app / views / layouts / application.html.erb에서 csrf_meta_tag를 설정하면 모든 것이 잘 작동합니다!

마침내 근본 원인을 찾을 수 있도록 도와 주셔서 감사합니다! 고마워요 ~


이것이 3.0 시리즈 공식 jquery-ujs 레일 어댑터 입니다. Rails 버전을 업그레이드 할 때 업데이트를 유지하는 것을 기억해야합니다.

나를 위해 3.0.3에서 3.0.8.rc4로 업그레이드한다는 것은 src/rails.js연결된 저장소에서 파일을 수동으로 가져 오는 것을 의미했습니다 .

Rails 3.1이 마침내 jQuery로 전환했기 때문에, Rails를 업데이트 할 때 (그리고 3.1의 내장 자산 파이프 라인을 사용하여) jquery-rails gem을 통해 미래에 자동 업데이트되어야합니다.

참고 URL : https://stackoverflow.com/questions/5126721/rails-not-reloading-session-on-ajax-post

반응형