我使用的rails版本是 3.0.5 的 ,然后使用的是 cookie_session ,现在遇到一个问题:
当我使用admin admin 登录之后,打开其他页面访问session的时候都没有问题,可以访问的到
http://localhost:3000/users/1/roles 这种url也可以访问的到session
但是当我访问以下url的时候
http://localhost:3000/users/1/roles/1
session 就清空了,我访问不到session中的值了,session中,原来就存了一个session[:user], 不知道是怎么回事
我的路由设置是
resources :users, :member => { :enable => :put } do
resources :roles
end
模仿的是Ruby On Rails 社区网站开发 编写的代码。
后来发现是 所有不是get 请求的都是清空session, put delete 都不行。
由此就奇怪了,然后我就想到要看一下 这个清空session函数 reset_session方法是什么时候有执行过,最后在 rails的gems 包中找到了如下代码:
C:\Ruby187\lib\ruby\gems\1.8\gems\actionpack-3.0.5\lib\action_controller\metal\request_forgery_protection.rb
如此便是找到了清空session的罪魁祸首,是因为 rails 的跨域访问问题的解决,所以导致的这个问题, 在rails进行before_filter 之前,要进行 protect_from_forgery 的校验,凡是不是 get请求的,或者是html、javascript请求的都直接清空session,而且不给予你任何提示。 这就是最恶心的地方,3.0.1的时候还是抛异常,如下代码:
因此我找了有一天时间才确认是这个问题
我犹豫不需要跨域访问,所以我采取了最简单的方法,则是把application_controller.rb中的内容 protect_from_forgery 删除掉就可以了,或者使用 skip_before_filter :verify_authenticity_token (还没有试验过),至于以后的跨域访问研究,以后再更新。。。
还要上班呢。
当我使用admin admin 登录之后,打开其他页面访问session的时候都没有问题,可以访问的到
http://localhost:3000/users/1/roles 这种url也可以访问的到session
但是当我访问以下url的时候
http://localhost:3000/users/1/roles/1
session 就清空了,我访问不到session中的值了,session中,原来就存了一个session[:user], 不知道是怎么回事
我的路由设置是
resources :users, :member => { :enable => :put } do
resources :roles
end
模仿的是Ruby On Rails 社区网站开发 编写的代码。
后来发现是 所有不是get 请求的都是清空session, put delete 都不行。
由此就奇怪了,然后我就想到要看一下 这个清空session函数 reset_session方法是什么时候有执行过,最后在 rails的gems 包中找到了如下代码:
C:\Ruby187\lib\ruby\gems\1.8\gems\actionpack-3.0.5\lib\action_controller\metal\request_forgery_protection.rb
# Turn on request forgery protection. Bear in mind that only non-GET, HTML/JavaScript requests are checked. # # Example: # # class FooController < ApplicationController # protect_from_forgery :except => :index # # You can disable csrf protection on controller-by-controller basis: # # skip_before_filter :verify_authenticity_token # # It can also be disabled for specific controller actions: # # skip_before_filter :verify_authenticity_token, :except => [:create] # # Valid Options: # # * <tt>:only/:except</tt> - Passed to the <tt>before_filter</tt> call. Set which actions are verified. def protect_from_forgery(options = {}) self.request_forgery_protection_token ||= :authenticity_token prepend_before_filter :verify_authenticity_token, options end end protected # The actual before_filter that is used. Modify this to change how you handle unverified requests. def verify_authenticity_token verified_request? || handle_unverified_request end def handle_unverified_request reset_session end
如此便是找到了清空session的罪魁祸首,是因为 rails 的跨域访问问题的解决,所以导致的这个问题, 在rails进行before_filter 之前,要进行 protect_from_forgery 的校验,凡是不是 get请求的,或者是html、javascript请求的都直接清空session,而且不给予你任何提示。 这就是最恶心的地方,3.0.1的时候还是抛异常,如下代码:
# Turn on request forgery protection. Bear in mind that only non-GET, HTML/JavaScript requests are checked. # # Example: # # class FooController < ApplicationController # protect_from_forgery :except => :index # # # you can disable csrf protection on controller-by-controller basis: # skip_before_filter :verify_authenticity_token # end # # Valid Options: # # * <tt>:only/:except</tt> - Passed to the <tt>before_filter</tt> call. Set which actions are verified. def protect_from_forgery(options = {}) self.request_forgery_protection_token ||= :authenticity_token before_filter :verify_authenticity_token, options end end protected def protect_from_forgery(options = {}) self.request_forgery_protection_token ||= :authenticity_token before_filter :verify_authenticity_token, options end # The actual before_filter that is used. Modify this to change how you handle unverified requests. def verify_authenticity_token verified_request? || raise(ActionController::InvalidAuthenticityToken) end # Returns true or false if a request is verified. Checks: # # * is the format restricted? By default, only HTML requests are checked. # * is it a GET request? Gets should be safe and idempotent # * Does the form_authenticity_token match the given token value from the params? def verified_request? !protect_against_forgery? || request.forgery_whitelisted? || form_authenticity_token == params[request_forgery_protection_token] end # Sets the token value for the current session. def form_authenticity_token session[:_csrf_token] ||= ActiveSupport::SecureRandom.base64(32) end
因此我找了有一天时间才确认是这个问题
我犹豫不需要跨域访问,所以我采取了最简单的方法,则是把application_controller.rb中的内容 protect_from_forgery 删除掉就可以了,或者使用 skip_before_filter :verify_authenticity_token (还没有试验过),至于以后的跨域访问研究,以后再更新。。。
还要上班呢。
发表评论
-
mac系统装rvm 和 1.9.3
2014-04-02 21:00 0rvm install 1.9.3 --with-gcc ... -
ruby on rails ubuntu 数据库安装 mysql postgresql
2012-10-05 17:33 800ubuntu mysql 安装 sudo apt-get i ... -
Linecache19 fails to compile with 1.9.3-head
2012-07-29 23:55 978Linecache19 fails to compile wi ... -
ubuntu 安装 sqlite3 gem包时报错
2012-07-29 15:57 848ubuntu 安装 sqlite3 gem包时报错 Buil ... -
rmagick gem包 兼容windows xp 7
2012-04-16 16:55 597rmagick 2.12.0 gem包 兼容windows x ... -
ActionMailer: Hostname not match server certificate
2011-05-26 17:24 1437ActionMailer: Hostname not matc ... -
Net::SMTPAuthenticationError (530 5.7.0 Must issue a STARTTLS command first. 23s
2011-05-26 17:17 4509在配置发送邮件设置的时候 ActionMailer::Ba ... -
国外部署网站,time_zone 时区设置
2011-04-14 14:06 0最近研究了一下 rails的时区设置,主要是在 rails A ... -
rake aborted! Mysql::Error: query: not connected: CREATE TABLE `schema_migration
2011-03-14 18:21 1489rake aborted! Mysql::Error: que ... -
rails3 ActionController::RoutingError (uninitialized constant ApplicationControl
2011-03-10 09:52 1713rails3 ActionController::Routin ... -
ERROR NoMethodError: private method `gsub' called for
2011-01-21 11:25 1296ERROR NoMethodError: private me ... -
rails 安装数据库mysql sqlite 包时报错 解决
2011-01-04 22:15 1212rails在gem install mysql/sqlite3 ... -
rubymine 3.0 4.0 注册码 序列号 破解
2011-01-04 15:51 2815name: rubymine ===== LICENSE BE ... -
Called id for nil, which would mistakenly be 4 错误解决之一
2010-12-24 16:17 1153Called id for nil, which would ... -
will_paginate 与 rails3集成时,分页 界面显示不出来
2010-11-18 19:59 1575rails 3新增XXS机制,导致html标签在output的 ...
相关推荐
Final Edition》是Rails 3.0.5时代的一本经典教程,它不仅教授了如何使用Rails框架构建Web应用,更传递了敏捷开发的理念和最佳实践,对于任何希望掌握Rails和敏捷开发方法的开发者来说,都是一本不可多得的参考书。...
Rails :: SessionCookie 快速,松散耦合的请求有关经过Cookie验证的应用程序的规范。 为什么 可能,您可能已经看到了很多像这样的代码: # config/initializers/session_store.rb Rails . application . config . ...
### Rails 2.0 的配置方法 #### 一、引言 Rails 2.0作为Ruby on Rails(简称ROR)框架的一个重要版本,在Web开发领域具有不可忽视的地位。本篇将详细介绍Rails 2.0的配置过程及注意事项,帮助初学者快速上手并深入...
activerecord-session_store, 从 Rails 中提取的记录存储的活动会话 Active Record 会话存储由 Active Record 类支持的会话存储。 提供了默认类,但是任何对 Active Record 会话类的对象鸭类型都有文本 session_id ...
rails generate active_record:session_migration 运行迁移: rake db:migrate 然后,在config/initializers/session_store.rb设置会话存储: Rails . application . config . session_store :active_record_...
- **特点**:Rails遵循“约定优于配置”的原则,简化了Web应用的开发过程,使得开发者能够专注于业务逻辑而非框架本身。 #### 三、创建一个新的Rails项目 - **步骤**:通过命令行使用`rails new project_name`来...
### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...
Rails提供了Session存储,可以用来临时存储用户的购物车信息,但这种存储方式不适用于持久保存。因此,通常我们会将购物车内容存入数据库,以便用户在不同会话之间保持购物车状态。在添加或删除商品时,更新购物车...
《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...
Rails是Ruby语言的一个著名Web开发框架,全称为Ruby on Rails,它遵循MVC(Model-View-Controller)架构模式,旨在提高开发效率和代码可读性。...在实际操作中,参考Rails的官方文档和社区资源将是提升技能的好方法。
Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...
Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...
从给定的文件信息来看,我们正在探讨的是一本关于Ruby on Rails的书籍,书名为《Simply Rails2》,作者是Patrick Lenz。本书旨在为初学者提供深入理解Ruby on Rails框架的指南,从基础概念到高级主题均有涵盖,是...
在开发Web应用时,Ruby on Rails(简称Rails)框架因其高效、简洁的代码风格和强大的社区支持而备受青睐。Aptana是一款强大的集成开发环境(IDE),尤其适用于Rails项目的开发,它提供了丰富的特性来提升开发效率。...
Rails 2.0 API 文档是一个非常宝贵的资源,它为开发者提供了全面的指南,以便于在使用Ruby on Rails 2.0版本时更好地理解和利用其框架功能。Ruby on Rails(简称Rails)是一个开源的Web应用框架,它遵循MVC(模型-...
2. **更好的性能**:由于API通常处理的是JSON数据而非HTML,所以Rails API优化了对JSON格式的支持,降低了内存占用和处理时间。 3. **路由优化**:Rails API的路由系统更侧重于资源操作,简化了API路由的定义,方便...
2. HTTP方法:使用GET、POST、PUT、DELETE等HTTP方法来表示CRUD操作,GET用于获取资源,POST用于创建,PUT用于更新,DELETE用于删除。 3. 状态码:正确使用HTTP状态码来传达请求结果,如200表示成功,404表示未找到...
**Ruby for Rails** Ruby是一种面向对象的动态编程语言,它以其简洁、优雅的语法和强大的元编程能力而闻名。在Web开发领域,Ruby与Rails框架的结合,即Ruby on Rails(RoR),开创了Web应用的新纪元。Ruby on Rails...