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