用于Webservice访问的Ruby on Rails线程安全类变量

时间:2016-06-22 17:02:18

标签: ruby-on-rails ruby multithreading model-view-controller concurrency

我有一个系统,根据登录用户我需要设置一些类变量,因为每个数据库表名都有变化,并且与webserver通信的密钥变为,它是用户文档。 / p>

我的用户类变量,比如全局变量,它是否是线程安全的?有很多用户使用系统将事情保存在错误的地方的任何机会吗?

我只是在会话上设置了密钥并填写了Configuracao类

def set_variables
    if current_usuario
        session[:seller_document] ||= current_usuario.documento
        Configuracao.logged_in_document = current_usuario.documento
    end
end

2 个答案:

答案 0 :(得分:1)

对于线程安全,您不需要使用类变量。

会话对象是一个cookie,因此如果用户在每次访问后清除了cookie,则该特定会话中的一个特定“用户”仅限于该用户。因此,访问您网站并将其用作网络服务的另一个应用程序将获得cookie。

通常在过滤器之前的应用程序中,您将登录“用户”并使用用户凭据设置会话,因此您希望访问您的服务的应用程序通过提供身份验证凭据来“登录”。这可能是确保始终设置seller_document的好地方。

这里没有多线程问题,因为您没有专门分支进程。

将Rails应用程序作为Web服务是完全正常的。您正在执行rails要执行的所有操作,而不需要在标准Rails应用程序所需的正常安全性和开发注意事项之上进行任何特殊考虑。

答案 1 :(得分:1)

以这种方式使用类变量不是线程安全的。你可以使用本地线程(即Thread.current[:some_key]),但总的来说这对我来说就像是一种设计气味。