类似struts的token,使用session保存token,调用check_token后就把session里的token清掉,所以不能重复调用。
因为有些界面可能会有多个表单,这些表单最好共用同一个token,不然提交过来的token很难验证,所以这里做了处理,不会多次生成。
[code]
<%= form_tag(:controller => "test", :action => "test") %>
<%= token_field %>
<%= submit_tag "提交" %>
</form>
[/code]
检查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
[code]
<%= form_tag(:controller => "test", :action => "test") %>
<%= token_field %>
<%= submit_tag "提交" %>
</form>
[/code]
检查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