<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    快樂工作,快樂生活!
    編程就是1+1
    posts - 11,comments - 4,trackbacks - 0

    2009 9 月10 日 ,國內領先的在線服務(SaaS Software as a Service )提供商用友 偉庫網 ,正式推出旨在進一步改善用戶在線應用體驗的新服務——偉庫應用加速器。即日起,用戶只需在偉庫網 以及國內主流下載網站頁面上點擊相關圖標,便可免費獲取用友財務寶(網上記賬 )、用友商貿寶(網上進銷存)以及用友營銷 寶(客盈門)服務,感受偉庫網 的應用加速新體驗。

    據介紹,與此前全部基于互聯網絡的在線服務產品不同,偉庫應用加速器采取了富客戶端桌面應用形式 ,其所涵蓋的用友財務寶、用友商貿寶以及用友營銷 寶等新服務更加契合當前用戶使用習慣,是可以讓用戶看到的實實在在的實體化服務。用戶可以方便的在偉庫網 以及國內主流下載網站的頁面上下載軟件包到本地,并安裝相關服務。

    除了進一步豐富了用友 偉庫網 在線服務產品的應用模式之外,此次推出的偉庫應用加速器,仍然延續了此前完全基于互聯網絡的在線服務內容,其中用友財務寶(網上記賬 )、用友商貿寶(網上進銷存)面向企業的業務管理,而用友營銷 寶(客盈門)則是主要針對中小企業的營銷 服務,包括偉庫大黃頁數據查詢等服務。

    在此之前,有不少國內SaaS 用戶反映,網絡速度慢、IE 補丁更新等因素長期困擾其應用體驗。而偉庫應用加速器的推出可以妥善地解決這些問題。

    據 了解,與基于互聯網絡的在線應用相比,新服務首先在產品性能方面做了改善,這主要體現在兩個方面:一是針對網絡穩定性的改進,新服務可以解決此前部分用戶 遇到的網絡不穩定帶來的問題,如數據無法及時保存等;二是功能實現的提速,用戶不會感覺到網絡延時。新服務提供離線功能,可以實現數據的本地化存儲,而在 用戶下一次登陸網絡時,數據可以實現同步上傳。

    其次,借助Adobe_AIR 技術,偉庫應用加速器不挑瀏覽器,用戶不必再為瀏覽器的版本低或補丁更新而困擾,而且新服務便于用戶在交替使用不同版本瀏覽器時進行應用移植。

    第三,相對于此前完全基于互聯網絡的在線服務,偉庫應用加速器不再局限于搜索引擎的推廣方式,用戶除了可以在偉庫網 直接下載或在線安裝新服務,還可以在國內主流下載網站包括天空、華軍、小熊在線、太平洋在線、泡泡網、中關村在線、IT168 、中國共享軟件注冊中心、非凡軟件、硅谷動力、多特軟件、PChome 、新浪等相關頁面進行下載。

    值得一提的是,偉庫應用加速器是完全的綠色軟件,不寫入用戶終端系統的注冊表,支持在線實時安裝,可實現自動更新,并方便安裝卸載。而這一新服務對用戶終端設備沒有特殊要求,除去Adobe_AIR 軟件,偉庫應用加速器僅占1~3Mb 空間。

     

    欲了解偉庫應用加速器的詳細內容請點擊:

    http://www.wecoo.com/treasure/download.html

    posted @ 2009-09-11 13:26 楊之廷 閱讀(343) | 評論 (0)編輯 收藏
    1.盡可能少的頁面請求
      如頁面引入的js,css等文件
      開發可以多個,發布必須合并,減少瀏覽器的訪問次數
    2.獲取數據用get,表單提交用post
      get速度優于post

    posted @ 2008-07-11 14:27 楊之廷 閱讀(146) | 評論 (0)編輯 收藏

    一、在姿態上要低調


        在低調中修煉自己:低調做人無論在官場、商場還是政治軍事斗爭中都是一種進可攻、退可守,看似平淡,實則高深的處世謀略。


        謙卑處世人常在:謙卑是一種智慧,是為人處世的黃金法則,懂得謙卑的人,必將得到人們的尊重,受到世人的敬仰。


        大智若愚,實乃養晦之術:“大智若愚”,重在一個“若”字,“若”設計了巨大的假象與騙局,掩飾了真實的野心、權欲、才華、聲望、感情。這種甘為愚鈍、甘當弱者的低調做人術,實際上是精于算計的隱蔽,它鼓勵人們不求爭先、不露真相,讓自己明明白白過一生。


       平和待人留余地:“道有道法,行有行規”,做人也不例外,用平和的心態去對待人事事,也是符合客觀要求的,因為低調做人才是跨進成功之門的鑰匙。


        時機未成熟時,要挺住:人非圣賢,誰都無法甩掉七情六欲,離不開柴米油鹽,即使遁入空門,“跳出三界外,不在五行中”,也要“出家人以寬大為懷,善哉!善 哉!”不離口。所以,要成就大業,就得分清輕重緩急,大小遠近,該舍的就得忍痛割愛,該忍的就得   從長計議,從而實現理想,成就大事,創建大業。


        毛羽不豐時,要懂得讓步:低調做人,往往是贏取對手的資助、最后不斷走向強盛、伸展勢力再反過來使對手屈服的一條有用的妙計。


        在“愚”中等待時機:大智若愚,不僅可以將有為示無為,聰明裝糊涂,而且可以若無其事,裝著不置可否的樣子,不表明態度,然后靜待時機,把自己的過人之處 一下子說出來,打對手一個措手不及。但是,大智若愚,關鍵是心中要有對付對方的策略。常用“糊涂”來迷惑對方耳目,寧可有為而示無為,萬不可無為示有為, 本來糊涂反裝聰明,這樣就會弄巧成拙。


        主動吃虧是風度:任何時候,情分不能踐踏。主動吃虧,山不轉水轉,也許以后還有合作的機會,又走到一起。若一個人處處不肯吃虧,則處處必想占便宜,于是, 妄想日生,驕心日盛。而一個人一旦有了驕狂的態勢,難免會侵害別人的利益,于是便起紛爭,在四面楚歌之中,又焉有不敗之理?


       為對手叫好是一種智慧:美德、智慧、修養,是我們處世的資本。為對手叫好,是一種謀略,能做到放低姿態為對手叫好的人,那他在做人做事上必定會成功。
       以寬容之心度他人之過:退一步海闊天空,忍一時風平浪靜。對于別人的過失,必要的指責無可厚非,但能以博大的胸懷去寬容別人,就會讓世界變得更精彩。

     

    二、在心態上要低調


    功成名就更要保持平常心:高調做事是一種責任,一種氣魄,一種精益求精的風格,一種執著追求的精神。所做的哪怕是細小的事、單調的事,也要代表自己的最高水平,體現自己的最好風格,并在做事中提高素質與能力。


    做人不要恃才傲物:當你取得成績時,你要感謝他人、與人分享、為人謙卑,這正好讓他人吃下了一顆定心丸。如果你習慣了恃才傲物,看不起別人,那么總有一天你會獨吞苦果!請記住:恃才傲物是做人一大忌。


    容人之過,方顯大家本色:大度睿智的低調做人,有時比橫眉冷對的高高在上更有助于問題的解決。對他人的小過以大度相待,實際上也是一種低調做人的態度,這種態度會使人沒齒難忘,終生感激。


    做人要圓融通達,不要鋒芒畢露:功成名就需要一種謙遜的態度,自覺地在名利場中做看客,開拓廣闊心境。
    知足者常樂:生活中如能降低一些標準,退一步想一想,就能知足常樂。人應該體會到自己本來就是無所欠缺的,這就是最大的財富了。


    不要太把自己當回事:不要把自己太當回事,才不會產生自滿心理,才能不斷地充實、完善自己,締造完善人生。


    謙遜是終生受益的美德:一個懂得謙遜的人是一個真正懂得積蓄力量的人,謙遜能夠避免給別人造成太張揚的印象,這樣的印象恰好能夠使一個員工在生活、工作中不斷積累經驗與能力,最后達到成功。


    淡泊名利無私奉獻:性格豪放者心胸必然豁達,壯志無邊者思想必然激越,思想激越者必然容易觸怒世俗和所謂的權威。所以,社會要求成大事者能夠隱忍不發,高調做事,低調做人。


    對待下屬要寬容:作為上司,應該具有容人之量,既然把任務交代給了下屬,就要充分想念下屬,讓其有施展才能的機會,只有這樣,才能人盡其才。


    簡樸是低調做人的根本:在生活上簡樸些、低調些,不僅有助于自身的品德修煉,而且也能贏得上下的交口稱譽。

     

    三、在行為上要低調

     

    深藏不露,是智謀:過分的張揚自己,就會經受更多的風吹雨打,暴露在外的椽子自然要先腐爛。一個人在社會上,如果不合時宜地過分張揚、賣弄,那么不管多么優秀,都難免會遭到明槍暗箭的打擊和攻擊。


    出頭的椽子易爛:時常有人稍有名氣就到處洋洋得意地自夸,喜歡被別人奉承,這些人遲早會吃虧的。所以在處于被動境地時一定要學會藏鋒斂跡、裝憨賣乖,千萬不要把自己變成對方射擊的靶子。


    才大不可氣粗,居功不可自傲:不可一世的年羹堯,因為在做人上的無知而落得個可悲的下場,所以,才大而不氣粗,居功而不自傲,才是做人的根本。


    盛名之下,其實難副:在積極求取巔峰期的時候,不妨思及顏之推倡導的人生態度,試圖明了知足常樂的情趣,捕捉中庸之道的精義,稍稍使生活步調快慢均衡,才不易陷入過度偏激的生活陷阱之中。


    做人不能太精明:低調做人,不耍小聰明,讓自己始終處于冷靜的狀態,在“低調”的心態支配下,兢兢業業,才能做成大事業。


    樂不可極,樂極生悲:在生活悲歡離合、喜怒哀樂的起承轉合過程中,人應隨時隨地、恰如其分地選擇適合自己的位置,起點不要太高。正如孟子所說的:“可以仕則仕,可以止則止,可以久則久,可以速則速。”


    做人要懂得謙遜:謙遜能夠克服驕矜之態,能夠營造良好的人際關系,因為人們所尊敬的是那些謙遜的人,而決不會是那些愛慕虛榮和自夸的人。


    規避風頭,才能走好人生路:老子認為“兵強則滅,木強則折”、“強梁者不得其死”。老子這種與世無爭的謀略思想,深刻體現了事物的內在運動規律,已為無數事實所證明,成為廣泛流傳的哲理名言。


    低調做人,便可峰回路轉:在待人處世中要低調,當自己處于不利地位,或者危險之時,不妨先退讓一步,這樣做,不但能避其鋒芒,脫離困境,而且還可以另辟蹊徑,重新占據主動。


    要想先做事,必須先做人:要想先做事,必須先做人。做好了人,才能做事。做人要低調謙虛,做事要高調有信心,事情做好了,低調做人水平就又上了一個臺階。
    功成身退,天之道:懂得功成身退的人,是識時務的,他知道何時保全自己,何時成就別人,以儒雅之風度來笑對人生。


    四、在言辭上要低調


    不要揭人傷疤:不能拿朋友的缺點開玩笑。不要以為你很熟悉對方,就隨意取笑對方的缺點,揭人傷疤。那樣就會傷及對方的人格、尊嚴,違背開玩笑的初衷。


    放低說話的姿態:面對別人的贊許恭賀,應謙和有禮、虛心,這樣才能顯示出自己的君子風度,淡化別人對你的嫉妒心理,維持和諧良好的人際關系。


    說話時不可傷害他人自尊:講話要有分寸,不要傷害他人。禮讓不是人際關系上的怯懦,而是把無謂的攻擊降到零。


    得意而不要忘形:得意時要少說話,而且態度要更加謙卑,這樣才會贏得朋友們的尊敬。


    禍從口出,沒必要自惹麻煩:要想在辦公室中保持心情舒暢的工作,并與領導關系融洽,那就多注意你的言行。對于姿態上低調、工作上踏實的人,上司們更愿意起用他們。如果你幸運的話,還很可能被上司意外地委以重任。


    莫逞一時口頭之快:凡事三思而行,說話也不例外,在開口說話之前也要思考,確定不會傷害他人再說出口,才能起到一言九鼎的作用,你也才能受到別人的尊重和認可。


    口出狂言者禍必至:是不是因為物欲文明的催生所致,如今社會上各類職業當中都有動輒口出狂言的人。
    恥笑譏諷來不得:言為心聲,語言受思想的支配,反應一個人的品德。不負責任,胡說八道,造謠中傷,搬弄是非等等,都是不道德的。


    不要總是報怨原單位:跳槽屬于人才流動,是當今社會很正常的一種現象,并不為奇,而且跳槽者屢屢能在新的團 隊里找到適合自己的位置,創造更佳的業績。如果這一步還沒有達到,你就急急忙忙地大耍“嘴功”,以貶低老團隊的手段來抬高自己在新團隊的人緣和地位的話, 那你就大錯特錯了!


    說話不可太露骨:別以為如實相告,別人就會感激涕零。要知道,我們永遠不能率性而為、無所顧忌,話語出口前,考慮一下別人的感受,是一種成熟的人處世方法。


    沉默是金:沉默,并不是讓大家永不說話,該說的時候還是要說的。就像佛祖那樣境界的人,也還是會與人說話,傳授佛法,適度的語言本身也是一種沉默。


    五、在思想上要高調


    給自己一個希望:不論你遇到了多揪心的挫折,都應當以堅持不懈的信心和毅力,感動自己,感動他人,把自己錘煉成一個做大事的人。


    保持向上的激情:我們需要激情,需要開拓,讓我們從現在做起,兢兢業業,開拓創新,扎扎實實做好本職工作,在平凡的工作中燃燒激情。


    自信是高調做事的秘訣:信心對于做事成功者具有重要意義,成功的欲望是創造和擁有財富的源泉。人一旦有了這 種欲望,并經由自我暗示和潛意識的激發后形成一種自信心,這種信心就會轉化成一種“積極的感情”,它能幫助人們釋放出無窮的熱情、智慧和精力,進而幫助人 們獲得財富與事業上的巨大成就。


    別讓借口“吃掉”你的希望:無論什么時候,我們都不要為自己尋找借口,只有盡職盡責,勇往直前,不找借口,才能實現理想,創造輝煌人生。


    丑小鴨也能變成白天鵝:一個人有希望,再加上堅忍不拔的決心,就會產生創造的能力;一個人有希望,再加上持之以恒的努力,就會達到目的。


    點燃希望之火:一顆充滿希望的心靈,具有極大的創造力,這種創造力會激發人的潛能,實現人的理想。
    成功需要付出代價:從古到今,凡成事者,成大事者,莫不受盡磨難,在磨難中完成自我教育,如此也水到渠成地成就了事業。


    主動去做應該做的事:只有氣服懶惰,積極進取的人,才能不斷成功,不斷取得好成績。


    不要輕言放棄,堅持就能成功:抱定任何都不放棄的信念,即使在一片懊悔或嘆息、寬容或指責的氛圍中也要堅持。是的,任何時候都不要放棄,無論條件多么的困難,只要能堅持到底,成功就一定屬于你。


    學會自己鼓勵自己:能自己鼓勵自己的人就算不是一個成功者,但絕對不會是一個失敗者,你還是趁早練練這“功夫”吧!


    永遠保持好心情:突破困境的方法,首先在于要肅清胸中快樂和成功的仇敵,其次要集中思想,堅定意識。只有運用正確的思想,并抱定堅定的精神,才能從逆境中突圍。


    激發自己的潛能:倘若你和一般失敗者面談,你就會發現:他們之所以失敗,是因為他們從來不曾走進足以激發人、鼓勵人的環境中,是因為他們的潛能從來不曾被激發,是因為他們沒有力量從不良的環境中振作。


    不要畏懼貧窮和困苦:行走于人生叢林中的每個人都應該記住,如果你正在遭受困苦,這并不是完全是件壞事,“天將大任于斯人也,必先苦其心志,勞其筋骨,餓其體膚,空乏其身,行拂亂其所為”。因為老天要把重任交給你,必先磨煉和考驗你!


    發掘出自身的強項:當巨大的壓力、非常的變故和重大責任壓在一個人身上時,隱伏在他生命最深處的種種能力,才會突然涌現出來,使他成就大業。


    堅定生活的信念:困境可以檢驗一個人的品質。如果一個人敢于直面困境,積極主動尋求解決問題的辦法,能在任何不利的環境中始終充滿熱情,堅定對生活的信念,那么他遲早會成功。


    把挫折當成墊腳石:在生活中,有的人被挫折打倒,有的人卻把挫折當成墊腳石,不斷前進。只要我們正視坎坷,永不放棄自己的追求,生活的艱辛將被我們踩在腳下,生命將會永放光芒!


    對生活充滿熱情:有了熱情,就能把額外的工作視作機遇,就能把陌生人變成朋友,就能真誠地寬容別人。有了熱情,就能充分利用余暇時間來完成自己的興趣愛好。有了熱情,就會拋棄怨恨,變得心胸寬廣。有了熱情,就會戰勝困難,取得成功。


    六、在細節上要高調

     

    注重細節,從小事做起:看不到細節,或者不把細節當回事的人,對工作缺乏認真的態度,對事情只能是敷衍了事。而注重細節的人,不僅認真地對待工作,將小事做細,并且能在做細的過程中找到機會,從而使自己走上成功之路。


    工作中沒有小事:點石成金,滴水成河,只有認真對待自己所做的一切事情,才能克服萬難,取得成功。


    認真對待每一次訓練:那些在平時訓練和準備過程中認真對待的人則相反,由于一直接受了高強度的模擬訓練,他們更容易在關鍵的比賽中表現出鎮定的心態,因為在他們心目中,這無異于平時的一場簡單的比賽和訓練。


    悄悄地為他人做點好事;試著去真心真意地幫助別人,當這一切完全發自你的意愿時,你將會感覺到這是件多么快樂的事,你的心靈就會得到回報—一種和平、安靜、溫暖的感覺。


    敬業精神+腳踏實地=成功:敬業,不僅僅是事業成功的保障,更是實現人生價值的手段,有的人在生活中,總是不滿意目前的職業,希望改變自己的處境。但世界上絕對沒有不勞而獲的事情,人們的成功無一不是按部就班、腳踏實地努力的結果。


    相信自己,正視開端:任何大的成功,都是從小事一點一滴累積而來的。沒有做不到的事,只有不肯做的人。想想你曾經歷過的失敗,當時的你真的用盡全力試過各種辦法了嗎?困難不會是成功的障礙,只有你自己才可能是一個最大的絆腳石。


    扎實的基礎是成功的法寶:如果一味地追求過高遠的目標,喪失了眼前可以成功的機會,就會成為高遠目標的犧牲 品。許多年輕人不滿意現在的工作,羨慕那些大款或高級白領人員,不安心本職工作,總是想跳槽。其實,沒有十分的本領,就不應有些妄想。我們還是多向成功之 人學習,腳踏實地,做好基礎工作,一步一個腳印地走上成功之途。


    實干才能脫穎而出:那些充滿樂觀精神、積極向上的人,總有一股使不完的勁,神情專注,心情愉快,并且主動找事做,在實干中實現自己的理想。


    不為薪水而工作:想要獲得成功,實現人生目標,就不要為薪水而工作。當一個人積極進取,盡心盡力時,他就能實現更高的人生價值。


    要征服世界,先戰勝自己:要想成功,就要戰勝自己的感情,培養自己控制命運的能力。


    用心做事,盡職盡責:以積極主動的心態對待你的工作、你的公司,你就會充滿活力與創造性的完成工作,你就會成為一個值得信賴的人,一個老板樂于雇用的人,一個擁有自己事業的人。


    對待小事也要傾注全部熱情:傾注全部熱情對待每件小事,不去計較它是多么的“微不足道”,你就會發現,原來每天平凡的生活竟是如此的充實、美好。

    posted @ 2008-07-08 12:59 楊之廷 閱讀(174) | 評論 (0)編輯 收藏
    href="javascript:void(0)"代替href="#" 瀏覽器會全頁面找'#'變量
    posted @ 2008-07-03 09:44 楊之廷 閱讀(355) | 評論 (2)編輯 收藏
    在oralce中主鍵最好根據業務設置成number類型,而不要是varchar2 ,varchar2尋址太慢,
    posted @ 2008-07-03 09:41 楊之廷 閱讀(121) | 評論 (0)編輯 收藏
    CREATE INDEX ISB_1_IDX ON ITEM_SUB_BALANCE (ACCOUNTBOOK_ID);

    CREATE INDEX ISB_2_IDX ON ITEM_SUB_BALANCE (IS_BAK_BOOK,ITEM_ID,SUBJECT_ID,PERIOD);

    CREATE INDEX ISB_3_IDX ON ITEM_SUB_BALANCE (ACCOUNTBOOK_ID,IS_BAK_BOOK,ITEM_ID,SUBJECT_ID,PERIOD);

        索引1+索引2=索引3的功能
    因此索引3是多余的


    posted @ 2008-07-03 09:39 楊之廷 閱讀(144) | 評論 (0)編輯 收藏
    兩個jsp頁面之間如何傳遞一個對象?比如一個List或者HashMap?
    答:
    用request.setAttribute("name",Object),request.getAttribute("name");
    或者session.setAttribute("name",Object),session.getAttribute("name");

    注意問題:
    • 如果用request,要注意request的范圍僅限于同一個request對象;如果使用了form的"action"或者response.sendRedirect("xxx.jsp")等調轉,則不再是同一個request對象,即用request.getAttribute("name")將取不到值。
    • 換成request.getRequestDispatcher("xxx.jsp").forward(request,response);
      才能共享request中數據
    • 如果用session,程序太慢,存在效率問題。

    基礎問題:
    1,所有再頁面提交的數據,在ACTION里只能通過request.getParameter( or values).
    2,要想通過attribute傳輸數據,必須保持在同一個request中,不論中轉了幾次(forward)。
    posted @ 2007-12-25 11:51 楊之廷 閱讀(3339) | 評論 (2)編輯 收藏
    湘味農家小炒肉:

    主料:鮮肉、青椒(尖椒為上)。

    配料:湖南剁辣椒、大蒜、姜、食鹽、雞精、醬油、料酒、醋,根據個人喜好,備瀏陽豆豉。

    制法:

    1、辣椒切片(尖椒切成筒狀)、鮮肉切片或絲、姜切絲、大蒜切片;

    2、將油燒熱,放入姜絲、蒜片,待爆出香味后,將肉絲倒入鍋中加適量鹽、煸炒至九成熟,盛起;

    3、煸炒青椒少時(根據火的大小調整時間),加少許鹽,加一勺剁辣椒,炒勻。將肉絲倒入鍋中,翻炒。

    4、加入醋、醬油、料酒、豆豉各適量,繼續翻炒少時,加適量雞精后炒勻,即可裝盤。

    湖南農家小炒肉一般選用肉質比較細嫩的豬肉,最好是“隔紗”五花肉,用青椒、豆豉爆炒,中間加入香噴噴的油渣。辣椒最好選用形狀瘦的、比較辣的青椒;嗜辣者亦可依個人喜好加入干尖椒或者剁辣椒的。好吃的小炒肉細嫩、有著青椒、瘦肉和豆豉的油香但是絕不膩人。做好這個菜,食材第一,火候第二,突出到酸辣、香鮮、軟嫩的品味,是最能見湘菜水平的家常菜。
    posted @ 2007-11-11 17:17 楊之廷 閱讀(289) | 評論 (0)編輯 收藏
    在java中基本數據類型及其包裝類,Stirng三種是傳值
    其它的引用數據類型是傳引用.傳的是變量所指向的對象的地址
    當賦值操作時,內存會存在多個"value"就是傳值.
    只有一個"value",有多個引用指向它.就是傳引用.

    posted @ 2007-10-30 22:45 楊之廷 閱讀(339) | 評論 (0)編輯 收藏
    摘要:雖然session機制在web應用程序中被采用已經很長時間了,但是仍然有很多人不清楚session機制的本質,以至不能正確的應用這一技術。本文將詳細討論session的工作機制并且對在Java web application中應用session機制時常見的問題作出解答。

    目錄:
    一、術語session
    二、HTTP協議與狀態保持
    三、理解cookie機制
    四、理解session機制
    五、理解javax.servlet.http.HttpSession
    六、HttpSession常見問題
    七、跨應用程序的session共享
    八、總結
    參考文檔

    一、術語session
    在我的經驗里,session這個詞被濫用的程度大概僅次于transaction,更加有趣的是transaction與session在某些語境下的含義是相同的。

    session,中文經常翻譯為會話,其本來的含義是指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個 session。有時候我們可以看到這樣的話“在一個瀏覽器會話期間,...”,這里的會話一詞用的就是其本義,是指從一個瀏覽器窗口打開到關閉這個期間 ①。最混亂的是“用戶(客戶端)在一次會話期間”這樣一句話,它可能指用戶的一系列動作(一般情況下是同某個具體目的相關的一系列動作,比如從登錄到選購商品到結賬登出這樣一個網上購物的過程,有時候也被稱為一個transaction),然而有時候也可能僅僅是指一次連接,也有可能是指含義①,其中的差別只能靠上下文來推斷②。

    然而當session一詞與網絡協議相關聯時,它又往往隱含了“面向連接”和/或“保持狀態”這樣兩個含義, “面向連接”指的是在通信雙方在通信之前要先建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始,與此相對的是寫信,在你把信發出去的時候你并不能確認對方的地址是否正確,通信渠道不一定能建立,但對發信人來說,通信已經開始了。“保持狀態”則是指通信的一方能夠把一系列的消息關聯起來,使得消息之間可以互相依賴,比如一個服務員能夠認出再次光臨的老顧客并且記得上次這個顧客還欠店里一塊錢。這一類的例子有“一個TCP session”或者 “一個POP3 session”③。

    而到了web服務器蓬勃發展的時代,session在web開發語境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與服務器之間保持狀態的解決方案④。有時候session也用來指這種解決方案的存儲結構,如“把xxx保存在session 里”⑤。由于各種用于web開發的語言在一定程度上都提供了對這種解決方案的支持,所以在某種特定語言的語境下,session也被用來指代該語言的解決方案,比如經常把Java里提供的javax.servlet.http.HttpSession簡稱為session⑥。

    鑒于這種混亂已不可改變,本文中session一詞的運用也會根據上下文有不同的含義,請大家注意分辨。
    在本文中,使用中文“瀏覽器會話期間”來表達含義①,使用“session機制”來表達含義④,使用“session”表達含義⑤,使用具體的“HttpSession”來表達含義⑥

    二、HTTP協議與狀態保持
    HTTP 協議本身是無狀態的,這與HTTP協議本來的目的是相符的,客戶端只需要簡單的向服務器請求下載某些文件,無論是客戶端還是服務器都沒有必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關系一樣。

    然而聰明(或者貪心?)的人們很快發現如果能夠提供一些按需生成的動態信息會使web變得更加有用,就像給有線電視加上點播功能一樣。這種需求一方面迫使HTML逐步添加了表單、腳本、DOM等客戶端行為,另一方面在服務器端則出現了CGI規范以響應客戶端的動態請求,作為傳輸載體的HTTP協議也添加了文件上載、 cookie這些特性。其中cookie的作用就是為了解決HTTP協議無狀態的缺陷所作出的努力。至于后來出現的session機制則是又一種在客戶端與服務器之間保持狀態的解決方案。

    讓我們用幾個例子來描述一下cookie和session機制之間的區別與聯系。筆者曾經常去的一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:
    1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎么對待了。這種做法就是協議本身支持狀態。
    2、發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以后的消費相聯系起來。這種做法就是在客戶端保持狀態。
    3、發給顧客一張會員卡,除了卡號之外什么信息也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店里的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種做法就是在服務器端保持狀態。

    由于HTTP協議是無狀態的,而出于種種考慮也不希望使之成為有狀態的,因此,后面兩種方案就成為現實的選擇。具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。同時我們也看到,由于采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到保存標識的目的,但實際上它還有其他選擇。

    三、理解cookie機制 
    cookie機制的基本原理就如上面的例子一樣簡單,但是還有幾個問題需要解決:“會員卡”如何分發;“會員卡”的內容;以及客戶如何使用“會員卡”。

    正統的cookie分發是通過擴展HTTP協議來實現的,服務器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。

    而cookie 的使用是由瀏覽器按照一定的原則在后臺自動發送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍大于等于將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。意思是麥當勞的會員卡只能在麥當勞的店里出示,如果某家分店還發行了自己的會員卡,那么進這家店的時候除了要出示麥當勞的會員卡,還要出示這家店的會員卡。

    cookie的內容主要包括:名字,值,過期時間,路徑和域。
    其中域可以指定某一個域比如.google.com,相當于總店招牌,比如寶潔公司,也可以指定一個域下的具體某臺機器比如www.google.com或者froogle.google.com,可以用飄柔來做比。
    路徑就是跟在域名后面的URL路徑,比如/或者/foo等等,可以用某飄柔專柜做比。
    路徑與域合在一起就構成了cookie的作用范圍。
    如果不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽器會話期的 cookie被稱為會話cookie。會話cookie一般不存儲在硬盤上而是保存在內存里,當然這種行為并不是規范規定的。如果設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。

    存儲在硬盤上的cookie 可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對于保存在內存里的cookie,不同的瀏覽器有不同的處理方式。對于IE,在一個打開的窗口上按 Ctrl-N(或者從文件菜單)打開的窗口可以與原窗口共享,而使用其他方式新開的IE進程則不能共享已經打開的窗口的內存cookie;對于 Mozilla Firefox0.8,所有的進程和標簽頁都可以共享同樣的cookie。一般來說是用javascript的window.open打開的窗口會與原窗口共享內存cookie。瀏覽器對于會話cookie的這種只認cookie不認人的處理方式經常給采用session機制的web應用程序開發者造成很大的困擾。

    下面就是一個goolge設置cookie的響應頭的例子
    HTTP/1.1 302 Found
    Location: http://www.google.com/intl/zh-CN/
    Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
    Content-Type: text/html




    這是使用HTTPLook這個HTTP Sniffer軟件來俘獲的HTTP通訊紀錄的一部分




    瀏覽器在再次訪問goolge的資源時自動向外發送cookie




    使用Firefox可以很容易的觀察現有的cookie的值
    使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。




    IE也可以設置在接受cookie前詢問




    這是一個詢問接受cookie的對話框。

    四、理解session機制
    session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。

    當程序需要為某個客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識 - 稱為 session id,如果已包含一個session id則說明以前已經為此客戶端創建過session,服務器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session并且生成一個與此session相關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個 session id將被在本次響應中返回給客戶端保存。

    保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發揮給服務器。一般這個cookie的名字都是類似于SEEESIONID,而。比如weblogic對于web應用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

    由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器。經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的后面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現形式為http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    另一種是作為查詢字符串附加在URL后面,表現形式為http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    這兩種方式對于用戶來說是沒有區別的,只是服務器在解析的時候處理的方式不同,采用第一種方式也有利于把session id的信息和正常程序參數區分開來。
    為了在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑后面都包含這個session id。

    另一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。比如下面的表單
    <form name="testform" action="/xxx">
    <input type="text">
    </form>
    在被傳遞給客戶端之前將被改寫成
    <form name="testform" action="/xxx">
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
    <input type="text">
    </form>
    這種技術現在已較少應用,筆者接觸過的很古老的iPlanet6(SunONE應用服務器的前身)就使用了這種技術。
    實際上這種技術可以簡單的用對action應用URL重寫來代替。

    在談論session機制的時候,常常聽到這樣一種誤解“只要關閉瀏覽器,session就消失了”。其實可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程序通知服務器刪除一個session,否則服務器會一直保留,程序一般都是在用戶做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知服務器它將要關閉,因此服務器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器后這個 session id就消失了,再次連接服務器時也就無法找到原來的session。如果服務器設置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給服務器,則再次打開瀏覽器仍然能夠找到原來的session。

    恰恰是由于關閉瀏覽器不會導致session被刪除,迫使服務器為seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就可以認為客戶端已經停止了活動,才會把session刪除以節省存儲空間。

    五、理解javax.servlet.http.HttpSession
    HttpSession是Java平臺對session機制的實現規范,因為它僅僅是個接口,具體到每個web應用服務器的提供商,除了對規范支持之外,仍然會有一些規范里沒有規定的細微差異。這里我們以BEA的Weblogic Server8.1作為例子來演示。

    首先,Weblogic Server提供了一系列的參數來控制它的HttpSession的實現,包括使用cookie的開關選項,使用URL重寫的開關選項,session持久化的設置,session失效時間的設置,以及針對cookie的各種設置,比如設置cookie的名字、路徑、域, cookie的生存時間等。

    一般情況下,session都是存儲在內存里,當服務器進程被停止或者重啟的時候,內存里的session也會被清空,如果設置了session的持久化特性,服務器就會把session保存到硬盤上,當服務器進程重新啟動或這些信息將能夠被再次使用, Weblogic Server支持的持久性方式包括文件、數據庫、客戶端cookie保存和復制。

    復制嚴格說來不算持久化保存,因為session實際上還是保存在內存里,不過同樣的信息被復制到各個cluster內的服務器進程中,這樣即使某個服務器進程停止工作也仍然可以從其他進程中取得session。

    cookie生存時間的設置則會影響瀏覽器生成的cookie是否是一個會話cookie。默認是使用會話cookie。有興趣的可以用它來試驗我們在第四節里提到的那個誤解。

    cookie的路徑對于web應用程序來說是一個非常重要的選項,Weblogic Server對這個選項的默認處理方式使得它與其他服務器有明顯的區別。后面我們會專題討論。

    關于session的設置參考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869

    六、HttpSession常見問題
    (在本小節中session的含義為⑤和⑥的混合)


    1、session在何時被創建
    一個常見的誤解是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被創建,注意如果JSP沒有顯示的使用 <% @page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的 session對象的來歷。

    由于session會消耗內存資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。

    2、session何時被刪除
    綜合前面的討論,session在下列情況下被刪除a.程序調用HttpSession.invalidate();或b.距離上一次收到客戶端發送的session id時間間隔超過了session的超時設置;或c.服務器進程被停止(非持久session)

    3、如何做到在瀏覽器關閉時刪除session
    嚴格的講,做不到這一點。可以做一點努力的辦法是在所有的客戶端頁面里使用javascript代碼window.oncolose來監視瀏覽器的關閉動作,然后向服務器發送一個請求來刪除session。但是對于瀏覽器崩潰或者強行殺死進程這些非常規手段仍然無能為力。

    4、有個HttpSessionListener是怎么回事
    你可以創建這樣的listener去監控session的創建和銷毀事件,使得在發生這樣的事件時你可以做一些相應的工作。注意是session的創建和銷毀動作觸發listener,而不是相反。類似的與HttpSession有關的listener還有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。

    5、存放在session中的對象必須是可序列化的嗎
    不是必需的。要求對象可序列化只是為了session能夠在集群中被復制或者能夠持久保存或者在必要時server能夠暫時把session交換出內存。在 Weblogic Server的session中放置一個不可序列化的對象在控制臺上會收到一個警告。我所用過的某個iPlanet版本如果 session中有不可序列化的對象,在session銷毀時會有一個Exception,很奇怪。

    6、如何才能正確的應付客戶端禁止cookie的可能性
    對所有的URL使用URL重寫,包括超鏈接,form的action,和重定向的URL,具體做法參見[6]
    http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

    7、開兩個瀏覽器窗口訪問應用程序會使用同一個session還是不同的session
    參見第三小節對cookie的討論,對session來說是只認id不認人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲方式都會對這個問題的答案有影響。

    8、如何防止用戶打開兩個瀏覽器窗口操作導致的session混亂
    這個問題與防止表單多次提交是類似的,可以通過設置客戶端的令牌來解決。就是在服務器每次生成一個不同的id返回給客戶端,同時保存在session里,客戶端提交表單時必須把這個id也返回服務器,程序首先比較返回的id與保存在session里的值是否一致,如果不一致則說明本次操作已經被提交過了。可以參看《J2EE核心模式》關于表示層模式的部分。需要注意的是對于使用javascript window.open打開的窗口,一般不設置這個id,或者使用單獨的id,以防主窗口無法操作,建議不要再window.open打開的窗口里做修改操作,這樣就可以不用設置。

    9、為什么在Weblogic Server中改變session的值后要重新調用一次session.setValue
    做這個動作主要是為了在集群環境中提示Weblogic Server session中的值發生了改變,需要向其他服務器進程復制新的session值。

    10、為什么session不見了
    排除session正常失效的因素之外,服務器本身的可能性應該是微乎其微的,雖然筆者在iPlanet6SP1加若干補丁的Solaris版本上倒也遇到過;瀏覽器插件的可能性次之,筆者也遇到過3721插件造成的問題;理論上防火墻或者代理服務器在cookie處理上也有可能會出現問題。
    出現這一問題的大部分原因都是程序的錯誤,最常見的就是在一個應用程序中去訪問另外一個應用程序。我們在下一節討論這個問題。

    七、跨應用程序的session共享

    常常有這樣的情況,一個大項目被分割成若干小項目開發,為了能夠互不干擾,要求每個小項目作為一個單獨的web應用程序開發,可是到了最后突然發現某幾個小項目之間需要共享一些信息,或者想使用session來實現SSO(single sign on),在session中保存login的用戶信息,最自然的要求是應用程序間能夠訪問彼此的session。

    然而按照Servlet規范,session的作用范圍應該僅僅限于當前應用程序下,不同的應用程序之間是不能夠互相訪問對方的session的。各個應用服務器從實際效果上都遵守了這一規范,但是實現的細節卻可能各有不同,因此解決跨應用程序session共享的方法也各不相同。

    首先來看一下Tomcat是如何實現web應用程序之間session的隔離的,從 Tomcat設置的cookie路徑來看,它對不同的應用程序設置的cookie路徑是不同的,這樣不同的應用程序所用的session id是不同的,因此即使在同一個瀏覽器窗口里訪問不同的應用程序,發送給服務器的session id也可以是不同的。


      

    根據這個特性,我們可以推測Tomcat中session的內存結構大致如下。




    筆者以前用過的iPlanet也采用的是同樣的方式,估計SunONE與iPlanet之間不會有太大的差別。對于這種方式的服務器,解決的思路很簡單,實際實行起來也不難。要么讓所有的應用程序共享一個session id,要么讓應用程序能夠獲得其他應用程序的session id。

    iPlanet中有一種很簡單的方法來實現共享一個session id,那就是把各個應用程序的cookie路徑都設為/(實際上應該是/NASApp,對于應用程序來講它的作用相當于根)。
    <session-info>
    <path>/NASApp</path>
    </session-info>

    需要注意的是,操作共享的session應該遵循一些編程約定,比如在session attribute名字的前面加上應用程序的前綴,使得 setAttribute("name", "neo")變成setAttribute("app1.name", "neo"),以防止命名空間沖突,導致互相覆蓋。


    在Tomcat中則沒有這么方便的選擇。在Tomcat版本3上,我們還可以有一些手段來共享session。對于版本4以上的Tomcat,目前筆者尚未發現簡單的辦法。只能借助于第三方的力量,比如使用文件、數據庫、JMS或者客戶端cookie,URL參數或者隱藏字段等手段。

    我們再看一下Weblogic Server是如何處理session的。


      

    從截屏畫面上可以看到Weblogic Server對所有的應用程序設置的cookie的路徑都是/,這是不是意味著在Weblogic Server中默認的就可以共享session了呢?然而一個小實驗即可證明即使不同的應用程序使用的是同一個session,各個應用程序仍然只能訪問自己所設置的那些屬性。這說明Weblogic Server中的session的內存結構可能如下




    對于這樣一種結構,在 session機制本身上來解決session共享的問題應該是不可能的了。除了借助于第三方的力量,比如使用文件、數據庫、JMS或者客戶端 cookie,URL參數或者隱藏字段等手段,還有一種較為方便的做法,就是把一個應用程序的session放到ServletContext中,這樣另外一個應用程序就可以從ServletContext中取得前一個應用程序的引用。示例代碼如下,

    應用程序A
    context.setAttribute("appA", session); 

    應用程序B
    contextA = context.getContext("/appA");
    HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); 

    值得注意的是這種用法不可移植,因為根據ServletContext的JavaDoc,應用服務器可以處于安全的原因對于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通過。

    那么Weblogic Server為什么要把所有的應用程序的cookie路徑都設為/呢?原來是為了SSO,凡是共享這個session的應用程序都可以共享認證的信息。一個簡單的實驗就可以證明這一點,修改首先登錄的那個應用程序的描述符weblogic.xml,把cookie路徑修改為/appA 訪問另外一個應用程序會重新要求登錄,即使是反過來,先訪問cookie路徑為/的應用程序,再訪問修改過路徑的這個,雖然不再提示登錄,但是登錄的用戶信息也會丟失。注意做這個實驗時認證方式應該使用FORM,因為瀏覽器和web服務器對basic認證方式有其他的處理方式,第二次請求的認證不是通過 session來實現的。具體請參看[7] secion 14.8 Authorization,你可以修改所附的示例程序來做這些試驗。

    八、總結
    session機制本身并不復雜,然而其實現和配置上的靈活性卻使得具體情況復雜多變。這也要求我們不能把僅僅某一次的經驗或者某一個瀏覽器,服務器的經驗當作普遍適用的經驗,而是始終需要具體情況具體分析。
    摘要:雖然session機制在web應用程序中被采用已經很長時間了,但是仍然有很多人不清楚session機制的本質,以至不能正確的應用這一技術。本文將詳細討論session的工作機制并且對在Java web application中應用session機制時常見的問題作出解答。

    posted @ 2007-09-26 16:25 楊之廷 閱讀(604) | 評論 (0)編輯 收藏
    僅列出標題  下一頁
    主站蜘蛛池模板: 亚洲国产精品嫩草影院在线观看| 免费真实播放国产乱子伦| 亚洲人成网7777777国产| 无码日韩人妻AV一区免费l| 亚洲av区一区二区三| 一级毛片视频免费| 亚洲精品国产日韩无码AV永久免费网| 色费女人18女人毛片免费视频| 国产精品无码一区二区三区免费| 人人狠狠综合久久亚洲| 亚洲国产专区一区| 久久久久久噜噜精品免费直播| 亚洲av永久无码精品漫画| 91精品免费高清在线| 中文字幕在线日亚洲9| 国产免费看插插插视频| 一个人看的免费视频www在线高清动漫| 亚洲无线一二三四区手机| 日韩精品无码免费专区网站| 亚洲国产天堂久久综合网站| 国产h视频在线观看免费| 另类图片亚洲校园小说区| 国产午夜亚洲精品午夜鲁丝片| 久久青草免费91线频观看站街| 亚洲图片校园春色| 拔擦拔擦8x华人免费久久| 青青草国产免费国产是公开| 亚洲精品国产精品乱码不卡√| 精品无码免费专区毛片| 亚洲色精品三区二区一区| 国产91精品一区二区麻豆亚洲 | 亚洲色大成网站www永久| 免费精品人在线二线三线区别| WWW亚洲色大成网络.COM| 国产成人亚洲综合无码精品| 中字幕视频在线永久在线观看免费 | 一二三四影视在线看片免费 | av无码国产在线看免费网站| 国产精品亚洲综合网站| 亚洲免费视频网站| 国产精品免费_区二区三区观看|