我是一个新人,所以也许这是一个非常愚蠢的问题 我有一个控制器:
class MainPageController < ApplicationController
def uid=(xid)
@uid=xid
end
def idx
response.headers.delete('X-Frame-Options')
@uid=params[:user_id]
log=Logger.new(STDOUT)
log.debug("UID #{@uid}")
log.debug("#{params[:access_token]}")
app=VK::Application.new(app_id: 4914826, app_secret: 'ZjeOFuApRPVdvL234Tsu', version: '5.31', access_token: params[:access_token])
end
def queue_req
end
def app_init
#vkjson=app.friends.getOnline uid
response.headers.delete('X-Frame-Options')
log=Logger.new(STDOUT)
log.debug("UID FO JSON #{@uid}")
render json: {'uid'=>@uid}.to_json
end
end
idx - 由默认路由调用。默认视图 - 初始化一些js后 - 使用ajax调用init。我得到一个答案,@uid为空。在日志中 - 在idx中 - @uid - 是coorect,在init中 - 已经是null。为什么呢?
这是页面代码的一部分
<script type="text/javascript">
VK.init(function() {
$.ajax({
url: 'http://localhost:3000/init', // JSON_URL is a global variable
dataType: 'json',
error: function(xhr_data) {
alert ('Error')
},
success: function(xhr_data) {
alert(xhr_data.uid)
},
contentType: 'application/json'
});
});
</script>
代码有什么问题? 谢谢!
答案 0 :(得分:0)
Web请求,Web服务器,Web一般都是无状态的。因此,当您在@uid = params[:user_id]
方法中设置idx
时,它在该请求/响应的生命周期内有效,但下一个请求由您的控制器的新实例处理,并在该新实例中{{ 1}}尚未设置。
我们在网络世界中伪造状态的方式是使用cookie,在第一次访问时将cookie发送回浏览器,浏览器会在每次请求时自动将该cookie发送回Web服务器。我们可以在第一个请求中将我们想要的任何信息放入该cookie中,浏览器会将这些信息发回给我们并随后发出请求 - 这样我们就可以伪造有状态。
Rails在名为sessions的cookie之上添加了另一个安全层,允许我们在cookie中安全地存储信息,然后在后续请求中安全地检索它。
因此,在@uid
方法中将@uid=params[:user_id]
更改为session[:uid] = @uid = params[:user_id]
,然后在idx
中填写第一行:app_init