2012-05-22 3 views
4

레일즈 사이트를 단일 페이지로만 구현하고 AJAX를 통해 다른 모든 작업을 수행하기로 결정했습니다. 문제는 meta에서 생성 된 CSRF 토큰이 서명 또는 서명 양식을 제출하는 데 사용되면 무효화된다는 것입니다. 페이지를 다시로드하지 않고 어떻게 업데이트 할 수 있습니까?AJAX로 레일에 CSRF 토큰로드

+0

'getElementById' 또는'getElementsByTagName'을 사용하여'META' 태그를 조작하는 것이 잘못된 이유는 무엇입니까? –

+0

동일한 가입을 전/후 가입으로 사용하면 CSRF 토큰을 거부합니다. 전체 페이지를 다시로드하지 않고 토큰을 업데이트하는 방법에 대해 궁금합니다. – Chris

답변

0

모든 단일 요청 (또는 게시 또는 무엇이든) 이후에 레일스가 CSRF 메타 토큰을 무효화한다고 생각하지 않습니다 (그렇지 않은 경우 backbone.js와 같은 프레임 워크는 힘들 수 있습니다 :). 당신은 아마 당신이 생각 요청하기 전에 요청을하고 있습니다

https://github.com/rails/rails/blob/7fb99e5743d88c04357e09960d112376428a6faa/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L100

올바른 토큰없이 무효 하나이며, 따라서 레일은 세션을 삭제하고 후속 요청들은 previously-을 통과하는 경우에도 유효하지 않은 것으로 표시된다 올바른 토큰. 각 아약스 요청

+0

페이지를 새로 고치지 않고 여러 요청 (양식 제출)을 만들고 싶다면 어떻게 생겼습니까? – Chris

0

:

데이터에 추가 :

authenticity_token : '<% = form_authenticity_token %>'

0

당신은 넣어 위해 아약스 호출에 아래와 같은 beforeSend을 사용할 수 있습니다, 포스트 방법 . $.ajax({ type: 'POST', beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}, url: your url, data: data });