论坛首页 入门技术论坛

Rails项目防止表单重复提交

浏览 5920 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2006-12-07  
类似struts的token,使用session保存token,调用check_token后就把session里的token清掉,所以不能重复调用。

因为有些界面可能会有多个表单,这些表单最好共用同一个token,不然提交过来的token很难验证,所以这里做了处理,不会多次生成。

module ApplicationHelper
  def token_field
    hidden_field_tag(:__token__, (@__token__ ||= (session[:__token__] = 
        Digest::SHA1.hexdigest((Time.now.to_i + rand(0xffffff)).to_s)[0..39])))
  end
end


class ApplicationController < ActionController::Base
  def check_token
    if session[:__token__] == params[:__token__]
      session[:__token__] = nil
      session.update
      return true
    end
    false
  end
end


<%= form_tag(:controller => "test", :action => "test") %>
  <%= token_field %>
  <%= submit_tag "提交" %>
</form>


检查token:
#方法1:
class TestController < ApplicationController
  def test
    unless check_token
      return redirect_to("/")
    end
    #...
  end
end

#方法2:
class TestController < ApplicationController
  before_filter :check_token, : only => ["test"], : redirect_to => "/"

  def test
    #...
  end
end
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics