`
qwlong
  • 浏览: 30691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rails 3.0.5 非get 方法 清空session

阅读更多
我使用的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

      # 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 (还没有试验过),至于以后的跨域访问研究,以后再更新。。。
还要上班呢。
分享到:
评论

相关推荐

    Agile Web Development with Rails 4th -Final Edition

    Final Edition》是Rails 3.0.5时代的一本经典教程,它不仅教授了如何使用Rails框架构建Web应用,更传递了敏捷开发的理念和最佳实践,对于任何希望掌握Rails和敏捷开发方法的开发者来说,都是一本不可多得的参考书。...

    rails-session_cookie:一个用于获取原始Rails会话Cookie的机架应用

    Rails :: SessionCookie 快速,松散耦合的请求有关经过Cookie验证的应用程序的规范。 为什么 可能,您可能已经看到了很多像这样的代码: # config/initializers/session_store.rb Rails . application . config . ...

    rails2.0的配置方法

    ### Rails 2.0 的配置方法 #### 一、引言 Rails 2.0作为Ruby on Rails(简称ROR)框架的一个重要版本,在Web开发领域具有不可忽视的地位。本篇将详细介绍Rails 2.0的配置过程及注意事项,帮助初学者快速上手并深入...

    activerecord-session_store, 从 Rails 中提取的记录存储的活动会话.zip

    activerecord-session_store, 从 Rails 中提取的记录存储的活动会话 Active Record 会话存储由 Active Record 类支持的会话存储。 提供了默认类,但是任何对 Active Record 会话类的对象鸭类型都有文本 session_id ...

    activerecord-session_store:从Rails中提取的Active Record的会话存储

    rails generate active_record:session_migration 运行迁移: rake db:migrate 然后,在config/initializers/session_store.rb设置会话存储: Rails . application . config . session_store :active_record_...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **特点**:Rails遵循“约定优于配置”的原则,简化了Web应用的开发过程,使得开发者能够专注于业务逻辑而非框架本身。 #### 三、创建一个新的Rails项目 - **步骤**:通过命令行使用`rails new project_name`来...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    rails敏捷开发的购物车系统

    Rails提供了Session存储,可以用来临时存储用户的购物车信息,但这种存储方式不适用于持久保存。因此,通常我们会将购物车内容存入数据库,以便用户在不同会话之间保持购物车状态。在添加或删除商品时,更新购物车...

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    rails 项目起步示例

    Rails是Ruby语言的一个著名Web开发框架,全称为Ruby on Rails,它遵循MVC(Model-View-Controller)架构模式,旨在提高开发效率和代码可读性。...在实际操作中,参考Rails的官方文档和社区资源将是提升技能的好方法。

    Rails项目源代码

    Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    rails2-sample

    从给定的文件信息来看,我们正在探讨的是一本关于Ruby on Rails的书籍,书名为《Simply Rails2》,作者是Patrick Lenz。本书旨在为初学者提供深入理解Ruby on Rails框架的指南,从基础概念到高级主题均有涵盖,是...

    使用Aptana+Rails开发Rails Web应用(中文)

    在开发Web应用时,Ruby on Rails(简称Rails)框架因其高效、简洁的代码风格和强大的社区支持而备受青睐。Aptana是一款强大的集成开发环境(IDE),尤其适用于Rails项目的开发,它提供了丰富的特性来提升开发效率。...

    好用的rails 2.0 Api 文档

    Rails 2.0 API 文档是一个非常宝贵的资源,它为开发者提供了全面的指南,以便于在使用Ruby on Rails 2.0版本时更好地理解和利用其框架功能。Ruby on Rails(简称Rails)是一个开源的Web应用框架,它遵循MVC(模型-...

    rails api(文档)

    2. **更好的性能**:由于API通常处理的是JSON数据而非HTML,所以Rails API优化了对JSON格式的支持,降低了内存占用和处理时间。 3. **路由优化**:Rails API的路由系统更侧重于资源操作,简化了API路由的定义,方便...

    rails-api-4.0.0

    2. HTTP方法:使用GET、POST、PUT、DELETE等HTTP方法来表示CRUD操作,GET用于获取资源,POST用于创建,PUT用于更新,DELETE用于删除。 3. 状态码:正确使用HTTP状态码来传达请求结果,如200表示成功,404表示未找到...

    Ruby+for+Rails

    **Ruby for Rails** Ruby是一种面向对象的动态编程语言,它以其简洁、优雅的语法和强大的元编程能力而闻名。在Web开发领域,Ruby与Rails框架的结合,即Ruby on Rails(RoR),开创了Web应用的新纪元。Ruby on Rails...

Global site tag (gtag.js) - Google Analytics