青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

qiezi的學(xué)習(xí)園地

AS/C/C++/D/Java/JS/Python/Ruby

  C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::

Login Engine是非常好用的一個(gè)登錄engine,不過也有個(gè)缺點(diǎn),它把用戶信息緩存在session里。如果用戶每次修改完自己的資料,都把session更新的話,自然是不會(huì)有什么數(shù)據(jù)不同步的問題。不過試想這樣一種情況:

1、用戶A登錄;用戶A的信息將保存在session[:user]里。
2、管理員操作用戶A,修改用戶A的資料并保存。
3、用戶A刷新頁面。

如果顯示用戶資料是從session[:user]讀取的話,顯然用戶A看到的是老的資料。

正確的做法是管理員修改用戶資料以后,把用戶session里的內(nèi)容也更新,當(dāng)然這個(gè)實(shí)施起來有些困難,目前看來無法由用戶ID獲得對(duì)應(yīng)的session。

有朋友說session里不應(yīng)該緩存用戶信息,而應(yīng)只保存用戶ID。這是正確的,這樣可以解決上面的問題,不過帶來的問題是每次都要從數(shù)據(jù)庫查詢。

如果每次刷新頁面都從數(shù)據(jù)庫重新讀取用戶信息,對(duì)性能影響是很大的。試想一下用戶正在瀏覽一個(gè)論壇的帖子列表,這個(gè)頁面可能所有用戶看起來都是一樣的,唯一不一樣的地方是上面用戶信息的顯示。由于大部分內(nèi)容都一樣,可以使用緩存加快瀏覽速度。不過卻由于session里只保存了用戶ID,不得不讀取數(shù)據(jù)庫來獲得用戶信息,這樣就把速度又拖慢了。

所以應(yīng)該把用戶信息緩存起來,但要保證它能及時(shí)更新。方法自己做一個(gè)緩存管理器,能根據(jù)用戶ID得到用戶信息,也能隨時(shí)更新它。

學(xué)著ActionController::Caching做了一個(gè)UserManager,它可以根據(jù)線程配置來自動(dòng)開關(guān)互斥器:
(/vender/plugins/login_engine/lib/login_engine/user_management.rb)

module?UserManagement? # :nodoc:
??class?UnthreadedUserManager? # :nodoc:
????def?initialize? # :nodoc:
?????? @users ? = ?{}
????end
????
????def?get(user_id)
??????
@users [user_id]
????end
????
????def?set(user_id
, ?user)
??????
@users [user_id]? = ?user
????end
??end
??
??module?ThreadSafety?
# :nodoc:
????def?get(user_id)? # :nodoc:
?????? @mutex . synchronize?{?super?}
????end
????def?set(user_id
, ?user)? # :nodoc:
?????? @mutex . synchronize?{?super?}
????end
??end
??
??class?UserManager?
< ?UnthreadedUserManager
????def?initialize
??????super
??????
if ?ActionController :: Base . allow_concurrency
????????
@mutex ? = ?Mutex . new
????????UserManager
. send ( : include , ?ThreadSafety)
??????end
????end
??end
??
??@
@user_manager ? = ?UserManagement :: UserManager . new
??
??def?set_current_user(user)
????
return ?session[ : user_id]? = ?nil? if ?user . nil ?
????session[
: user_id]? = ?user . id
????cache_user(user)
??end
??
??def?current_user
????get_user(session[
: user_id])
??end
??
??def?cache_user(user)
????
return ? if ?user . nil ?
????@
@user_manager . set(user . id , ?user)
??end
??
??def?get_user(user_id)
????@
@user_manager . get(user_id)
??end
end??

修改(/verdor/plugins/login_engine/lib/login_engine.rb):

#.
require
?'login_engine/user_management'

module?LoginEngine
??include?UserManagement
??
#.
end

加入上面加粗的2行。

修改(/verdor/plugins/login_engine/lib/login_engine/authenticated_system.rb),把session[:user]替換為session[:user_id]。

修改(/verdor/plugins/login_engine/app/controllers/user_controller.rb):

??def?login
????
return?if?generate_blank
????
@user?=?User.new(params[:user])
????
if?user?=?User.authenticate(params[:user][:login],?params[:user][:password])
??????user
.logged_in_at?=?Time.now
??????user
.save
??????set_current_user(user)
??????flash[
:notice]?=?"Login?successful"
??????redirect_to_stored_or_default?
:action?=>?'home'
????
else
??????
@login?=?params[:user][:login]
??????flash
.now[:warning]?=?'Login?unsuccessful'
????end
??end

??def?logout
????set_current_user(nil)
????redirect_to?
:action?=>?'login'
??end

??def?get_user_to_act_on
????
@user?=?current_user
??end

簡(jiǎn)單測(cè)試:

require?'login_engine'

class?ApplicationController?
<?ActionController::Base
??include?LoginEngine
??
??helper?
:user
??model?
:user
????
??before_filter?
:login_required
end

class?ShowController?<?ApplicationController
??def?show
????render_text?"User?name:?#{current_user.first_name}"
??end
end

class?AdminController?<?ApplicationController
??def?edit
????user?
=?User.find(params[:id])
????user
.update_attributes(:first_name?=>?params[:name])
????cache_user(user)
??? render_text "User name: #{user.first_name}"
??end
end

一個(gè)簡(jiǎn)單的模擬:
1、用戶A從IE登錄,訪問/show/show,將顯示用戶的名字。
2、管理員從FF登錄,訪問/show/show,將顯示管理員名字。
3、管理員訪問/show/show/2?name=hello,其中2是用戶A的ID。這將把用戶A的名字修改為hello。
4、用戶A刷新頁面,可以看到顯示的用戶名字已經(jīng)發(fā)生變化。

以上過程說這個(gè)修改已經(jīng)達(dá)到目的。實(shí)現(xiàn)這個(gè)功能并不難,主要是為了保留Login Engine原有的功能不變。

修改后的代碼:
www.shnenglu.com/Files/cpunion/login_engine.rar
posted on 2006-05-08 21:13 qiezi 閱讀(279) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Ruby
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区三区久久| 国产精品视频观看| 亚洲国产成人91精品| 久久久久免费视频| 另类尿喷潮videofree| 亚洲国内自拍| 99精品热视频| 国产女主播视频一区二区| 欧美中文字幕在线| 久久精品国产一区二区三区免费看 | 一本大道av伊人久久综合| 91久久久国产精品| 欧美精品1区2区3区| 亚洲一区三区在线观看| 性欧美videos另类喷潮| 在线精品国产欧美| 亚洲免费观看视频| 国产伦精品一区二区三区免费| 久久久久久久综合| 欧美va亚洲va国产综合| 亚洲综合不卡| 久久精品国产第一区二区三区| 在线观看欧美一区| 亚洲最新色图| 亚洲电影在线免费观看| 在线一区欧美| 亚洲激情国产| 亚洲资源在线观看| 亚洲福利电影| 亚洲自拍偷拍麻豆| 99天天综合性| 久久婷婷丁香| 欧美一区二区成人6969| 欧美不卡视频一区| 久久精选视频| 国产精品视频午夜| 午夜精品久久久久久久99水蜜桃| 亚洲欧美一区二区精品久久久| 亚洲高清av在线| 午夜精品久久久久久久久| 99精品免费网| 久久免费高清| 久久精品国产综合| 国产精品v欧美精品∨日韩| 欧美成人乱码一区二区三区| 国产精品久久综合| 亚洲韩国青草视频| 亚洲国产成人av好男人在线观看| 亚洲伊人第一页| 在线视频中文亚洲| 欧美成人综合一区| 欧美成人乱码一区二区三区| 国产综合视频| 久久精品国产免费| 久久久久国产一区二区三区| 国产伦精品一区二区三区在线观看| 91久久精品国产91久久性色tv | 欧美aa国产视频| 久久影视精品| 狠狠色综合色区| 欧美专区日韩视频| 久久久久.com| 国产一区二区三区在线观看精品| 亚洲欧美日韩精品久久奇米色影视 | 在线亚洲免费视频| 欧美精品国产精品| 亚洲日本精品国产第一区| 亚洲精品国久久99热| 免费亚洲视频| 亚洲国产欧美一区二区三区同亚洲| 在线观看日韩www视频免费| 久久精品中文字幕一区| 久久综合综合久久综合| 伊人久久大香线| 男人的天堂亚洲| 亚洲日韩视频| 亚洲人成人77777线观看| 久久综合影音| 最新国产の精品合集bt伙计| 一区二区三区四区国产精品| 欧美日韩免费网站| 亚洲丝袜av一区| 欧美在线一二三四区| 尤物yw午夜国产精品视频| 久久综合精品国产一区二区三区| 欧美高清视频免费观看| 99国产精品久久久久久久| 欧美午夜不卡影院在线观看完整版免费 | 久久久成人网| 亚洲电影在线看| 欧美乱在线观看| 亚洲自拍偷拍色片视频| 蜜桃久久精品一区二区| 99精品热视频| 国产亚洲一区精品| 亚洲久久视频| 免费久久久一本精品久久区| 在线观看日韩av| 欧美激情亚洲激情| 亚洲一区二区三区中文字幕 | 国产精品视频精品视频| 久久精品国语| 一本久道久久综合中文字幕| 久久久久国产一区二区| 99伊人成综合| 国精品一区二区三区| 欧美日韩国产经典色站一区二区三区| 亚洲一区二区精品视频| 亚洲成色777777女色窝| 亚洲欧美日韩国产一区二区三区| 伊人激情综合| 国产精品亚洲人在线观看| 欧美91视频| 久久精品亚洲一区二区| 一本色道久久综合| 欧美国产大片| 久久美女性网| 亚洲欧美色一区| 一区二区日本视频| 亚洲国产片色| 一区在线观看视频| 国产欧美一区二区白浆黑人| 欧美乱在线观看| 蜜桃av综合| 久久精品成人一区二区三区蜜臀| 99国产精品久久久久久久成人热| 美女精品网站| 久久久视频精品| 久久爱另类一区二区小说| 亚洲一级在线观看| 一本色道久久综合狠狠躁篇的优点 | 久久久亚洲综合| 欧美一二三视频| 亚洲免费在线视频| 亚洲午夜精品久久久久久浪潮| 亚洲高清在线精品| 在线观看日韩av| 亚洲电影在线播放| 在线电影一区| 亚洲第一免费播放区| 一区二区三区在线免费播放| 国产专区一区| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 夜夜嗨av一区二区三区四区| 亚洲精品乱码久久久久久久久 | 久久不见久久见免费视频1| 欧美一级淫片播放口| 羞羞视频在线观看欧美| 性视频1819p久久| 欧美在线视频一区二区| 久久精品国产综合| 久久亚洲色图| 欧美高清hd18日本| 欧美激情1区| 亚洲精品一区二区三区99| 99国产欧美久久久精品| 一本色道久久88综合亚洲精品ⅰ| 一本色道久久88精品综合| 亚洲天堂av综合网| 玖玖玖国产精品| 国产婷婷色一区二区三区四区| 国产伦精品一区二区三区在线观看| 国产精品入口日韩视频大尺度| 国产欧美精品一区二区三区介绍| 国产九九精品| 在线观看欧美视频| 99成人精品| 午夜精品亚洲| 蜜桃av噜噜一区| 日韩天天综合| 欧美在线视频观看| 欧美成人午夜激情在线| 欧美午夜视频网站| 狠狠色综合色综合网络| 亚洲毛片视频| 欧美一区二区在线观看| 欧美国产精品专区| 一级日韩一区在线观看| 久久国产精品99国产| 欧美精品在线免费观看| 国产区在线观看成人精品| 亚洲欧洲另类国产综合| 亚洲欧美日韩一区| 欧美jizz19性欧美| 亚洲视频第一页| 久久综合一区| 国产精品专区h在线观看| 亚洲精品激情| 久久久五月婷婷| 亚洲视频网在线直播| 免播放器亚洲一区| 国产欧美一区二区精品性色| 亚洲精品国产拍免费91在线| 久久国产色av| 一区二区日韩免费看| 欧美电影在线观看| 伊人色综合久久天天| 羞羞色国产精品| 99精品欧美一区二区三区综合在线| 久久久久久久尹人综合网亚洲|