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

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

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

    賢仁居 George Gong
    It's never too late to learn
    posts - 32,comments - 16,trackbacks - 0
    http://blog.csdn.net/function413/article/details/8485822

    一、下載所需類包 (可在http://download.csdn.net/detail/function413/4977751中下載tomcat log4j.rar 里面包含以下JAR包)

    1、下載log4j下載1.2以后的版本

    下載地址:http://logging.apache.org/log4j/1.2/download.html

    2、下載tomcat-juli.jartomcat-juli-adapters.jar

    使用LOG4J來接管tomcat6.0.18的日志文件必須要下載兩個(gè)文件:tomcat-juli.jartomcat-juli-adapters.jar

    下載地址為:http://www.apache.org/dist/tomcat/tomcat-6/v6.0.18/bin/extras/ (如果tomcat為其他版本,請(qǐng)下載對(duì)應(yīng)版本的類包)

    二、修改相關(guān)配置文件

    1、修改${catalina.home}/conf/context.xml

    修改:<Context >為<Context swallowOutput="true" >只有這樣才能完全的把tomcat的stdout給接管過來。這一步很關(guān)鍵 在官網(wǎng)及網(wǎng)上找了許多資料都沒有提及。

    2、復(fù)制log4j.jar${catalina.home}/lib

    3、復(fù)制tomcat-juli-adapters.jar${catalina.home}/lib

    4、復(fù)制tomcat-juli.jar${catalina.home}/bin下,在該目錄會(huì)存在該文件,覆蓋 即可

    5、建立log4j.properties,并把其放到${catalina.home}/lib

    posted @ 2013-11-21 14:43 George Gong 閱讀(2037) | 評(píng)論 (0)編輯 收藏

    在維護(hù)服務(wù)器時(shí)常常需要用到linux Shell命令,將常用的寫在這里備查:

    telnet 10.10.50.122 7070

    nslookup 查看域名解析

    netstat -anp 顯示系統(tǒng)端口使用情況 a表示全部socket n不解析名稱 p顯示PID

    lsof -i :端口 顯示占用該端口的進(jìn)程情況

    last

    history

    scp root@10.10.10.11:/home/asd/we.zip /home/we/ scp文件傳輸

    w 當(dāng)前登錄用戶

    ps -ef|grep java 不解釋!

    查看機(jī)器吞吐量(throughput)

    sudo ifconfig eth0

    iftop 監(jiān)視網(wǎng)卡即時(shí)吞吐量

    iptraf 監(jiān)視網(wǎng)卡即時(shí)吞吐量

    iostat 磁盤吞吐量查看

    iostat 結(jié)果解釋
    * rrqm/s:   每秒進(jìn)行 merge 的讀操作數(shù)目。即 delta(rmerge)/s
    * wrqm/s:   每秒進(jìn)行 merge 的寫操作數(shù)目。即 delta(wmerge)/s
    * r/s:       每秒完成的讀 I/O 設(shè)備次數(shù)。即 delta(rio)/s
    * w/s:       每秒完成的寫 I/O 設(shè)備次數(shù)。即 delta(wio)/s
    * rsec/s:    每秒讀扇區(qū)數(shù)。即 delta(rsect)/s
    * wsec/s:   每秒寫扇區(qū)數(shù)。即 delta(wsect)/s
    * rkB/s:     每秒讀K字節(jié)數(shù)。是 rsect/s 的一半,因?yàn)槊可葏^(qū)大小為512字節(jié)。(需要計(jì)算)
    * wkB/s:     每秒寫K字節(jié)數(shù)。是 wsect/s 的一半。(需要計(jì)算)
    * avgrq-sz: 平均每次設(shè)備I/O操作的數(shù)據(jù)大小 (扇區(qū))。delta(rsect+wsect)/delta(rio+wio)
    * avgqu-sz: 平均I/O隊(duì)列長度。即 delta(aveq)/s/1000 (因?yàn)閍veq的單位為毫秒)。
    * await:     平均每次設(shè)備I/O操作的等待時(shí)間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
    * svctm:    平均每次設(shè)備I/O操作的服務(wù)時(shí)間 (毫秒)。即 delta(use)/delta(rio+wio)
    * %util:    一秒中有百分之多少的時(shí)間用于 I/O 操作,或者說一秒中有多少時(shí)間 I/O 隊(duì)列是非空的。即 delta(use)/s/1000 (因?yàn)閡se的單位為毫秒)
    

    df -m 硬盤使用情況

    free -m 內(nèi)存使用情況

    top 查看CPU使用情況

    關(guān)于 load   average
    一般來說只要每個(gè)CPU的當(dāng)前活動(dòng)進(jìn)程數(shù)不大于3那么系統(tǒng)的性能就是良好的,如果每個(gè)CPU的任務(wù)數(shù)大于5,那么就表示這臺(tái)機(jī)器的性能有嚴(yán)重問題。
    對(duì)于上面的例子來說,假設(shè)系統(tǒng)有兩個(gè)CPU,那么其每個(gè)CPU的當(dāng)前任務(wù)數(shù)為:8.13/2=4.065。這表示該系統(tǒng)的性能是可以接受的。

    查看機(jī)器硬件信息

    測(cè)試機(jī)器的硬件信息:
    查看CPU信息(型號(hào))
    # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
    8  Intel(R) Xeon(R) CPU            E5410   @ 2.33GHz
    (看到有8個(gè)邏輯CPU, 也知道了CPU型號(hào))
    # cat /proc/cpuinfo | grep physical | uniq -c
    4 physical id      : 0
    4 physical id      : 1
    (說明實(shí)際上是兩顆4核的CPU)
    # getconf LONG_BIT
    32
    (說明當(dāng)前CPU運(yùn)行在32bit模式下, 但不代表CPU不支持64bit)
    # cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
    8
    (結(jié)果大于0, 說明支持64bit計(jì)算. lm指long mode, 支持lm則是64bit)
    再完整看cpu詳細(xì)信息, 不過大部分我們都不關(guān)心而已.
    # dmidecode | grep 'Processor Information'
    查看內(nèi) 存信息
    # cat /proc/meminfo
    # uname -a
    Linux euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux
    (查看當(dāng)前操作系統(tǒng)內(nèi)核信息)
    # cat /etc/issue | grep Linux
    Red Hat Enterprise Linux AS release 4 (Nahant Update 5)
    (查看當(dāng)前操作系統(tǒng)發(fā)行版信息)
    查看機(jī)器型號(hào)
    # dmidecode | grep "Product Name"
    查看網(wǎng)卡信息
    # dmesg | grep -i eth
    

    du -ms /usr/local/jdk 查看文件夾使用的空間大小

    du -sm * | sort -n 當(dāng)前路徑下各文件夾大小,并排序顯示

    posted @ 2010-10-18 11:40 George Gong 閱讀(469) | 評(píng)論 (1)編輯 收藏

    Ubuntu Linux系統(tǒng)環(huán)境變量配置文件介紹在Ubuntu中有如下幾個(gè)文件可以設(shè)置環(huán)境變量

    /etc/profile:在登錄時(shí),操作系統(tǒng)定制用戶環(huán)境時(shí)使用的第一個(gè)文件,此文件為系統(tǒng)的每個(gè)用戶設(shè)置環(huán)境信息,當(dāng)用戶第一次登錄時(shí),該文件被執(zhí)行。

    /etc/environment:在登錄時(shí)操作系統(tǒng)使用的第二個(gè)文件,系統(tǒng)在讀取你自己的 profile前,設(shè)置環(huán)境文件的環(huán)境變量。

    ~/.profile:在登錄時(shí)用到的第三個(gè)文件是.profile文件,每個(gè)用戶都可使用該文件輸入專用于自己使用的shell信息,當(dāng)用戶登錄時(shí),該文件僅僅執(zhí)行一次!默認(rèn)情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶的.bashrc文件。

    /etc/bashrc:為每一個(gè)運(yùn)行bash shell的用戶執(zhí)行此文件.當(dāng)bash shell被打開時(shí),該文件被讀取.

    ~/.bashrc:該文件包含專用于你的bash shell的bash信息,當(dāng)?shù)卿洉r(shí)以及每次打開新的shell時(shí),該該文件被讀取。

    使用source命令刷新環(huán)境變量

    posted @ 2010-10-18 11:39 George Gong 閱讀(378) | 評(píng)論 (0)編輯 收藏
    原文地址: http://ifelseif.blog.sohu.com/145381162.html

    聽說支持向量機(jī)是比神經(jīng)網(wǎng)絡(luò)還牛X的分類器,我就拿來玩了玩,用國立臺(tái)灣大學(xué)Chih-Chung Chang和Chih-Jen Lin編寫的libsvm函數(shù)庫。國內(nèi)的網(wǎng)站很多帖子都抄來抄去的,犯錯(cuò)bug都一樣。哎,希望此貼可以正本清源。

        首先下載libSVM的最新版本,他們的主頁在此http://www.csie.ntu.edu.tw/~cjlin/libsvm/index.html源碼手冊(cè)都有,真是好人啊!手冊(cè)寫的清晰明了通俗易懂,盡管是英文的。想快速上手看具體操作步驟的直接翻到appendix吧。

        在linux下部署libSVM是簡(jiǎn)單到不能再簡(jiǎn)單了,make一下就完事兒了。什么!你沒有g(shù)cc,沒有python,沒有g(shù)nuplot?自己apt-get去吧。

        用windows的童鞋,首先你們要安裝python和gnuplot。python的主頁為http://www.python.org/,安裝程序可以在這里下載。gnuplot的主頁為http://www.gnuplot.info/download.html,安裝程序在這里。python是需要安裝的,gnuplot是綠色軟件找個(gè)地方解壓就行。如果你網(wǎng)速快的話強(qiáng)烈推薦pythonxy這個(gè)東西,python科學(xué)計(jì)算相關(guān)的軟件包基本都包括了,有功夫好好學(xué)吧開源的哦。

        需要手工添加環(huán)境變量,保證python根目錄,gnuplot的bin目錄,libsvm的windows目錄都在path里面,我的電腦上是c:\python26,C:\Python26\gnuplot\bin,c:\Users\gongwei\program\libsvm-2.9\windows\。然后還要改libSVM\tools目錄下的easy.py和grid.py文件,把gnuplot路徑那一項(xiàng)改成gnuplot_exe = r"C:\Python26\gnuplot\bin\pgnuplot.exe"。gnuplot有三個(gè)exe,這里只能用這個(gè)因?yàn)樗梢酝ㄟ^管道輸入數(shù)據(jù),另外兩個(gè)都不行。都弄完之后,嘗試運(yùn)行一下吧:

        python easy.py train.1 test.1

        其中train.1和test.1都是作者提供的測(cè)試數(shù)據(jù)。可以在這里下載guide里面的數(shù)據(jù),這里還有更多。

        好啦下面就等著彈窗吧,會(huì)彈出一個(gè)gnuplot的窗口,里面的圖像會(huì)隨著網(wǎng)絡(luò)的訓(xùn)練逐步更新。大功告成!

        libSVM的使用很簡(jiǎn)單,會(huì)用python的可以參考easy.py和grid.py寫自己的script。libSVM使用c++編寫,提供java的源碼,還支持R (also Splus), MATLAB, Perl, Ruby, Weka, Common LISP, CLISP, Haskell, LabVIEW的調(diào)用。想用的話基本都有自己適合的環(huán)境。

        最后還是要感謝libSVM的幾位作者們,寫出這么好的軟件。向臺(tái)灣同胞致敬!

    posted @ 2010-09-19 22:25 George Gong 閱讀(884) | 評(píng)論 (0)編輯 收藏

    數(shù)學(xué)之美 系列九 -- 如何確定網(wǎng)頁和查詢的相關(guān)性



    [我們已經(jīng)談過了如何自動(dòng)下載網(wǎng)頁如何建立索引如何衡量網(wǎng)頁的質(zhì)量(Page Rank)。我們今天談?wù)勅绾未_定一個(gè)網(wǎng)頁和某個(gè)查詢的相關(guān)性。了解了這四個(gè)方面,一個(gè)有一定編程基礎(chǔ)的讀者應(yīng)該可以寫一個(gè)簡(jiǎn)單的搜索引擎了,比如為您所在的學(xué)校或院系建立一個(gè)小的搜索引擎。]

    我們還是看上回的例子,查找關(guān)于“原子能的應(yīng)用”的網(wǎng)頁。我們第一步是在索引中找到包含這三個(gè)詞的網(wǎng)頁(詳見關(guān)于布爾運(yùn)算的系列)。現(xiàn)在任何一個(gè)搜索引擎都包含幾十萬甚至是上百萬個(gè)多少有點(diǎn)關(guān)系的網(wǎng)頁。那么哪個(gè)應(yīng)該排在前面呢?顯然我們應(yīng)該根據(jù)網(wǎng)頁和查詢“原子能的應(yīng)用”的相關(guān)性對(duì)這些網(wǎng)頁進(jìn)行排序。因此,這里的關(guān)鍵問題是如何度量網(wǎng)頁和查詢的相關(guān)性。

    我們知道,短語“原子能的應(yīng)用”可以分成三個(gè)關(guān)鍵詞:原子能、的、應(yīng)用。根據(jù)我們的直覺,我們知道,包含這三個(gè)詞多的網(wǎng)頁應(yīng)該比包含它們少的網(wǎng)頁相關(guān)。當(dāng)然,這個(gè)辦法有一個(gè)明顯的漏洞,就是長的網(wǎng)頁比短的網(wǎng)頁占便宜,因?yàn)殚L的網(wǎng)頁總的來講包含的關(guān)鍵詞要多些。因此我們需要根據(jù)網(wǎng)頁的長度,對(duì)關(guān)鍵詞的次數(shù)進(jìn)行歸一化,也就是用關(guān)鍵詞的次數(shù)除以網(wǎng)頁的總字?jǐn)?shù)。我們把這個(gè)商稱為“關(guān)鍵詞的頻率”,或者“單文本詞匯頻率”(Term Frequency),比如,在某個(gè)一共有一千詞的網(wǎng)頁中“原子能”、“的”和“應(yīng)用”分別出現(xiàn)了 2 次、35 次 和 5 次,那么它們的詞頻就分別是 0.002、0.035 和 0.005。 我們將這三個(gè)數(shù)相加,其和 0.042 就是相應(yīng)網(wǎng)頁和查詢“原子能的應(yīng)用”
    相關(guān)性的一個(gè)簡(jiǎn)單的度量。概括地講,如果一個(gè)查詢包含關(guān)鍵詞 w1,w2,...,wN, 它們?cè)谝黄囟ňW(wǎng)頁中的詞頻分別是: TF1, TF2, ..., TFN。 (TF: term frequency)。 那么,這個(gè)查詢和該網(wǎng)頁的相關(guān)性就是:
    TF1 + TF2 + ... + TFN。

    讀者可能已經(jīng)發(fā)現(xiàn)了又一個(gè)漏洞。在上面的例子中,詞“的”站了總詞頻的 80% 以上,而它對(duì)確定網(wǎng)頁的主題幾乎沒有用。我們稱這種詞叫“應(yīng)刪除詞”(Stopwords),也就是說在度量相關(guān)性是不應(yīng)考慮它們的頻率。在漢語中,應(yīng)刪除詞還有“是”、“和”、“中”、“地”、“得”等等幾十個(gè)。忽略這些應(yīng)刪除詞后,上述網(wǎng)頁的相似度就變成了0.007,其中“原子能”貢獻(xiàn)了0.002,“應(yīng)用”貢獻(xiàn)了 0.005。

    細(xì)心的讀者可能還會(huì)發(fā)現(xiàn)另一個(gè)小的漏洞。在漢語中,“應(yīng)用”是個(gè)很通用的詞,而“原子能”是個(gè)很專業(yè)的詞,后者在相關(guān)性排名中比前者重要。因此我們需要給漢語中的每一個(gè)詞給一個(gè)權(quán)重,這個(gè)權(quán)重的設(shè)定必須滿足下面兩個(gè)條件:

    1. 一個(gè)詞預(yù)測(cè)主題能力越強(qiáng),權(quán)重就越大,反之,權(quán)重就越小。我們?cè)诰W(wǎng)頁中看到“原子能”這個(gè)詞,或多或少地能了解網(wǎng)頁的主題。我們看到“應(yīng)用”一次,對(duì)主題基本上還是一無所知。因此,“原子能“的權(quán)重就應(yīng)該比應(yīng)用大。

    2. 應(yīng)刪除詞的權(quán)重應(yīng)該是零。

    我們很容易發(fā)現(xiàn),如果一個(gè)關(guān)鍵詞只在很少的網(wǎng)頁中出現(xiàn),我們通過它就容易鎖定搜索目標(biāo),它的權(quán)重也就應(yīng)該大。反之如果一個(gè)詞在大量網(wǎng)頁中出現(xiàn),我們看到它仍然不很清楚要找什么內(nèi)容,因此它應(yīng)該小。概括地講,假定一個(gè)關(guān)鍵詞 w 在 Dw 個(gè)網(wǎng)頁中出現(xiàn)過,那么 Dw 越大,w 的權(quán)重越小,反之亦然。在信息檢索中,使用最多的權(quán)重是“逆文本頻率指數(shù)” (Inverse document frequency 縮寫為IDF),它的公式為log(D/Dw)其中D是全部網(wǎng)頁數(shù)。比如,我們假定中文網(wǎng)頁數(shù)是D=10億,應(yīng)刪除詞“的”在所有的網(wǎng)頁中都出現(xiàn),即Dw=10億,那么它的IDF=log(10億/10億)= log (1) = 0。假如專用詞“原子能”在兩百萬個(gè)網(wǎng)頁中出現(xiàn),即Dw=200萬,則它的權(quán)重IDF=log(500) =6.2。又假定通用詞“應(yīng)用”,出現(xiàn)在五億個(gè)網(wǎng)頁中,它的權(quán)重IDF = log(2)
    則只有 0.7。也就只說,在網(wǎng)頁中找到一個(gè)“原子能”的比配相當(dāng)于找到九個(gè)“應(yīng)用”的匹配。利用 IDF,上述相關(guān)性計(jì)算個(gè)公式就由詞頻的簡(jiǎn)單求和變成了加權(quán)求和,即 TF1*IDF1 + TF2*IDF2 +... + TFN*IDFN。在上面的例子中,該網(wǎng)頁和“原子能的應(yīng)用”的相關(guān)性為 0.0161,其中“原子能”貢獻(xiàn)了 0.0126,而“應(yīng)用”只貢獻(xiàn)了0.0035。這個(gè)比例和我們的直覺比較一致了。

    TF/IDF(term frequency/inverse document frequency) 的概念被公認(rèn)為信息檢索中最重要的發(fā)明。在搜索、文獻(xiàn)分類和其他相關(guān)領(lǐng)域有廣泛的應(yīng)用。講起 TF/IDF 的歷史蠻有意思。IDF 的概念最早是劍橋大學(xué)的斯巴克-瓊斯[注:她有兩個(gè)姓] (Karen Sparck Jones)提出來的。斯巴克-瓊斯 1972 年在一篇題為關(guān)鍵詞特殊性的統(tǒng)計(jì)解釋和她在文獻(xiàn)檢索中的應(yīng)用的論文中提出IDF。遺憾的是,她既沒有從理論上解釋為什么權(quán)重IDF 應(yīng)該是對(duì)數(shù)函數(shù) log(D/Dw)(而不是其它的函數(shù),比如平方根),也沒有在這個(gè)題目上作進(jìn)一步深入研究,以至于在以后的很多文獻(xiàn)中人們提到 TF/IDF 時(shí)沒有引用她的論文,絕大多數(shù)人甚至不知道斯巴克-瓊斯的貢獻(xiàn)。同年羅賓遜寫了個(gè)兩頁紙的解釋,解釋得很不好。倒是后來康乃爾大學(xué)的薩爾頓(Salton)多次寫文章、寫書討論 TF/IDF 在信息檢索中的用途,加上薩爾頓本人的大名(信息檢索的世界大獎(jiǎng)就是以薩爾頓的名字命名的)。很多人都引用薩爾頓的書,甚至以為這個(gè)信息檢索中最重要的概念是他提出的。當(dāng)然,世界并沒有忘記斯巴克-瓊斯的貢獻(xiàn),2004年,在紀(jì)念文獻(xiàn)學(xué)學(xué)報(bào)創(chuàng)刊 60 周年之際,該學(xué)報(bào)重印了斯巴克-瓊斯的大作。羅賓遜在同期期刊上寫了篇文章,用香農(nóng)的信息論解釋 IDF,這回的解釋是對(duì)的,但文章寫的并不好、非常冗長(足足十八頁),把一個(gè)簡(jiǎn)單問題搞復(fù)雜了。其實(shí),信息論的學(xué)者們已經(jīng)發(fā)現(xiàn)并指出,其實(shí) IDF 的概念就是一個(gè)特定條件下、關(guān)鍵詞的概率分布的交叉熵(Kullback-Leibler Divergence)(詳見上一系列)。這樣,信息檢索相關(guān)性的度量,又回到了信息論。

    現(xiàn)在的搜索引擎對(duì) TF/IDF 進(jìn)行了不少細(xì)微的優(yōu)化,使得相關(guān)性的度量更加準(zhǔn)確了。當(dāng)然,對(duì)有興趣寫一個(gè)搜索引擎的愛好者來講,使用 TF/IDF 就足夠了。 如果我們結(jié)合上網(wǎng)頁排名(Page Rank),那么給定一個(gè)查詢,有關(guān)網(wǎng)頁綜合排名大致由相關(guān)性和網(wǎng)頁排名乘積決定。
    posted @ 2010-09-19 19:45 George Gong 閱讀(226) | 評(píng)論 (0)編輯 收藏
    Ubuntu 10.04下默認(rèn)的即時(shí)通訊是Empathy,但Empathy的plugin還不多,它可以通過安裝plugin來獲取Pidgin下的plugin。Pidgin下只需要安裝pidgin-sipe就可以登錄Communicator賬號(hào)。我查了很多資料,最終Empathy沒有弄好,只弄好了pidgin。
    由于Ubuntu 10.04沒有Pidgin,首先安裝Pidgin,然后通過 sudo apt-get install pidgin-sipe命令安裝,注意這個(gè)pidgin-sipe的版本要在1.8.0+,這個(gè)是10.04下的默認(rèn)版本。然后重啟Pidgin后賬號(hào)類型會(huì)多了一項(xiàng)“Office Communicator”,接著輸入你的賬號(hào)就可以了。

    至于Empathy,有人通過pidgin-sipe + telepathy-haze 兩個(gè)plugin配置成功了,不過我沒有成功,以后再說吧:)

    posted @ 2010-05-21 10:05 George Gong 閱讀(887) | 評(píng)論 (0)編輯 收藏
    http://persevere.javaeye.com/blog/653716

    這幾天安裝了Ubuntu 10.04,確實(shí)很不錯(cuò)。但一不小心把頂端的面板給刪除了,這下麻煩了。雖然可以通過“新建面板”“添加到面板”一一恢復(fù),但一一查找都很麻煩,有沒有一種辦法可以恢復(fù)默認(rèn)的頂端面板。可以通過以下步驟:

    通過ALT+F2呼出應(yīng)用程序?qū)υ捒颍斎雊nome-terminal打開終端輸入以下命令:
     gconftool --recursive-unset/apps/panel  
       
     rm -rf ~/.gconf/apps/panel  
       
     pkill gnome-panel

    這樣就OK了

    posted @ 2010-05-21 09:45 George Gong 閱讀(691) | 評(píng)論 (1)編輯 收藏
    最近開始用eclipse3.5,下載了maven插件m2eclipse,使用后才發(fā)現(xiàn)每次project clean的時(shí)候這個(gè)maven builder都會(huì)自動(dòng)執(zhí)行,這個(gè)很惡心。google了半天也沒找到解決辦法,惡心。
    posted @ 2010-04-30 11:24 George Gong 閱讀(7468) | 評(píng)論 (2)編輯 收藏

    系統(tǒng)之前一直用的是maven-artifact-ant-2.0.4-dep.jar,但最近對(duì)一些jar包支持不好,運(yùn)行ant腳本出現(xiàn)以下問題:

    [artifact:dependencies] [WARNING] POM for 'ch.qos.logback:logback-classic:pom:0.9.9' is invalid. It will be ignored for artifact resolution. Reason: The POM expression: ${parent.version} could not be evaluated. Reason: ch.qos.logback:logback-classic:jar:${parent.version} references itself.

    這樣的話這個(gè)忽略的jar包就得手動(dòng)copy了,這樣你還得找這個(gè)jar包依賴的其他jar包是不是存在。后來在網(wǎng)上google了一下,發(fā)現(xiàn)現(xiàn)在都用maven-ant-tasks-2.1.0.jar,然后對(duì)build.xml稍作改動(dòng),如下即可:
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="hehe" default="maven-jar" xmlns:artifact="urn:maven-artifact-ant">
        
    <property file="build.properties" />
            
    <target name="maven-jar" description="Use Maven2 to manage jars' dependencies">
            
    <echo message="deleting old jar .. " />
            
    <delete dir="${web.dir}/WEB-INF/lib" />
            
    <copy todir="${web.dir}/WEB-INF/lib">
                
    <fileset id="runtimeFiles" dir="lib/mylib">
                    
    <include name="**/*.jar" />
                
    </fileset>
                
    <mapper type="flatten" />
            
    </copy>
            
    <echo message="Use Maven2 to manage jar." />
            
    <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant">
                
    <classpath>
                    
    <pathelement location="lib/maven-ant-tasks-2.1.0.jar" />
                
    </classpath>
            
    </typedef>

            
    <artifact:pom file="pom.xml" id="my.pom" />

            
    <artifact:dependencies pathId="dependency.classpath" filesetId="dependency.fileset" usescope="runtime">
                
    <pom refid="my.pom" />
            
    </artifact:dependencies>

            
    <copy todir="${web.dir}/WEB-INF/lib">
                
    <fileset refid="dependency.fileset" />
                
    <mapper type="flatten" />
            
    </copy>
        
    </target>
    </project>
    這樣就OK了
     
    posted @ 2010-04-30 00:12 George Gong 閱讀(2205) | 評(píng)論 (0)編輯 收藏

    這兩天調(diào)試一個(gè)asp.net程序,用戶在首頁登錄成功后,系統(tǒng)會(huì)在客戶端添加一個(gè)Cookie,然后重定向到首頁,首頁檢測(cè)到這個(gè)Cookie后就屏蔽掉登錄。我在本機(jī)調(diào)試的時(shí)候本能的用localhost,結(jié)果每次都不成功,Cookie不起作用。后來在hosts文件中將127.0.0.1 隨便映射成一個(gè)域名,一試就好了。到現(xiàn)在也不明白這是為什么,莫非是微軟覺得localhost的程序給自己添加Cookie是多此一舉?

    posted @ 2010-01-22 16:31 George Gong 閱讀(383) | 評(píng)論 (0)編輯 收藏

    這兩天開始研究一個(gè)韓國人寫的asp.net(C#)程序,好多年沒玩.net了,發(fā)現(xiàn)很生疏。首先要把源代碼在本機(jī)跑起來,安裝VS2005。然后打開網(wǎng)站把項(xiàng)目到進(jìn)去后,啟動(dòng)debug(F5)后出現(xiàn)問題, <add assembly="System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />這一行報(bào)錯(cuò),google了一下發(fā)現(xiàn)必須要安裝.net framework 3.5 sp1 ,如果還不行還要安裝MS Chart.exe,看來這個(gè)是圖形報(bào)表需要的東西。

    安裝完成后點(diǎn)擊自動(dòng)調(diào)試模式,還是報(bào)錯(cuò),這次提示web.config里的全局路徑出問題,后來仔細(xì)琢磨了一下發(fā)現(xiàn)VS默認(rèn)啟動(dòng)的Development Server自作聰明的在啟動(dòng)的URL后面加了一個(gè)項(xiàng)目名稱作為子路徑,這個(gè)導(dǎo)致了很多問題,項(xiàng)目里定義的相對(duì)路徑找不到,導(dǎo)致圖片、JS、CSS等無法顯示。好多人在罵微軟的這個(gè)stupid。

    google了一下解決方案,如下:點(diǎn)擊VS上面的“工具”--->“外部工具”,然后添加一個(gè)Development Server,自己定義名稱、端口號(hào)、虛擬路徑、物理路徑等。我的位置如下:
    標(biāo)題:Web Server Port:8080
    命令:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\WebDev.WebServer.EXE
    參數(shù):/port:8080 /path:D:\vs_workspace\ibt 這里沒有定義虛擬路徑,即為/
    然后勾選“使用輸出窗口”,這樣就有打印信息了。

    完成后你會(huì)發(fā)現(xiàn)“工具”里多了一個(gè)你定義的“Web Server Port:8080”,點(diǎn)擊一下就啟動(dòng)了。

    好多國內(nèi)的帖子到這里后就完事了,其實(shí)不然。因?yàn)檫@樣的話是解決了端口號(hào)和虛擬路徑的問題,但我發(fā)現(xiàn)這時(shí)候不能debug程序了,斷點(diǎn)沒用。
    國外的帖子找到了解決辦法,原來還差一步,就是替換VS給項(xiàng)目設(shè)置的默認(rèn)Development Server。在“解決方案資源管理區(qū)(solution explore)”里點(diǎn)擊項(xiàng)目工程(project),右鍵點(diǎn)擊并選擇“屬性頁”,選擇左邊的“啟動(dòng)選項(xiàng)”,在“服務(wù)器”里選擇“使用自定義服務(wù)器”,在基URL里填寫“http://localhost:8080/”,這樣就OK了。但跟默認(rèn)有區(qū)別的是,這次VS不管自動(dòng)啟動(dòng)Development Server,需要手動(dòng)啟動(dòng),然后才能點(diǎn)擊“啟動(dòng)調(diào)試(F5)”按鈕

    posted @ 2010-01-22 10:37 George Gong 閱讀(1097) | 評(píng)論 (0)編輯 收藏

    由于項(xiàng)目中的小文件太多,都是幾K的小文件,有100多G,所以必須要提升靜態(tài)文件的訪問速度。一開始用Nginx 與 Tomcat做集群,Nginx負(fù)責(zé)靜態(tài)資源的響應(yīng)。Nginx在Linux下跑的很爽,到Windows下就不太好了。Nginx前段時(shí)間推出了Windows版,拿來一試,感覺不太穩(wěn)定。在一個(gè)刀片機(jī)下作測(cè)試很好,但弄到正式環(huán)境下就不行了,ext tree顯示不出來,而且要等很久,最后頁面提示:ext無法顯示。最后跟同事商量,覺得還是apache+tomcat在windows下比較穩(wěn)定,轉(zhuǎn)手弄apache+tomcat。

    apache官方?jīng)]有提供win64版本,就找了一個(gè)外國哥們?cè)赩istual Studio 2005 下自己編譯的win64 apache,在測(cè)試機(jī)上安裝很輕松,然后布了2個(gè)tomcat,又在apache的mem cache中設(shè)置了3G的內(nèi)存做緩存,測(cè)試一切OK。接著弄正式服務(wù)器,第一臺(tái)正式服務(wù)器很順利,幾分鐘就搞定了。第二臺(tái)服務(wù)器就出了問題,apache無法啟動(dòng),提示:“由于應(yīng)用程序配置不正確 應(yīng)用程序未能啟動(dòng)。重新安裝應(yīng)用程序可能會(huì)糾正這個(gè)問題”。然后查看這兩臺(tái)服務(wù)器有何差異,最后發(fā)現(xiàn)第一臺(tái)上有.net framework 2,3,3.5,第二臺(tái)上一個(gè).net framework 都沒有。接著裝.net framework 2.0 service,還是不行。有文章說要安裝 vc redistribute 包,到微軟官方下載安裝,還是不行,郁悶。最后沒辦法,又下載安裝.ner framework 3.0,還是不行,靠!這時(shí)候我都不報(bào)希望了,又下載安裝.net framework 3.5,然后發(fā)現(xiàn)apache 可以了!最后一分鐘搞定第二臺(tái)服務(wù)器的apache+tomcat。

    我的apache+tomcat用的是ajp proxy通信方式,設(shè)置session sticky。

    好了,接下來觀察幾天看看效果如何

    posted @ 2010-01-15 11:28 George Gong 閱讀(2438) | 評(píng)論 (2)編輯 收藏

    SkillSoft的Business Skills課程的Objectives數(shù)據(jù)封裝方式與PagePlayer.properties的LMS_AICC_VERSION,LMS_AICC_V2_POST這兩項(xiàng)屬性值有關(guān)。
    LMS_AICC_VERSION值為2.2 or 3.5,默認(rèn)是3.5。當(dāng)LMS_AICC_VERSION=3.5時(shí),Objectives的Score的值以分號(hào)割開,如下:

    [Objectives_status]
    j_id.
    1=LEADA201001005000X020001
    j_status.
    1=c
    j_id.
    17=LEADA201001003000X820001
    j_score.
    17=33;33;-84
    j_id.
    2=LEADA201001002000X020001
    j_status.
    2=c
    j_id.
    16=LEADA201001005000X820001
    j_score.
    16=20;20;-21
    而LMS_AICC_VERSION=2.2時(shí),數(shù)據(jù)以逗號(hào)隔開,如下:
    [Objectives_status]
    j_id.
    1=LEADA201001005000X020001
    j_status.
    1=c
    j_id.
    17=LEADA201001003000X820001
    j_score.
    17=33,33,-84
    j_id.
    2=LEADA201001002000X020001
    j_status.
    2=c
    j_id.
    16=LEADA201001005000X820001
    j_score.
    16=20,20,-21

    LMS_AICC_V2_POST的值為ture or false,默認(rèn)為false。當(dāng)LMS_AICC_V2_POST=false時(shí),每次課程向LMS提交的數(shù)據(jù)都是最新的數(shù)據(jù),如果學(xué)員進(jìn)行了一次測(cè)試,課程的putparam提交的數(shù)據(jù)如下:
    [CORE]
    Lesson_Status
    =Incomplete
    Lesson_Location
    =LEADA201001MXX999X810001
    score
    =12
    time
    =00:04:18
    [Core_Lesson]
    20
    [Core_Vendor]
    20 May 2009 07:38:48 GMT,\u9AD8 \u7EA7 \u9886 \u5BFC \u539F \u5219
    [Objectives_status]
    j_id.
    1=LEADA201001005000X020001
    j_status.
    1=c
    j_id.
    17=LEADA201001003000X820001
    j_score.17=55

    j_id.
    2=LEADA201001002000X020001
    j_status.
    2=c
    j_id.
    16=LEADA201001005000X820001
    j_score.16=44

    當(dāng)LMS_AICC_V2_POST=true時(shí),課程向LMS提交的是完整數(shù)據(jù),如下:
    [CORE]
    Lesson_Status
    =Incomplete
    Lesson_Location
    =LEADA201001MXX999X810001
    score
    =12
    time
    =00:04:18
    [Core_Lesson]
    20
    [Core_Vendor]
    20 May 2009 07:38:48 GMT,\u9AD8 \u7EA7 \u9886 \u5BFC \u539F \u5219
    [Objectives_status]
    j_id.
    1=LEADA201001005000X020001
    j_status.
    1=c
    j_id.
    17=LEADA201001003000X820001
    j_score.
    17=55,33,33,-84
    j_id.
    2=LEADA201001002000X020001
    j_status.
    2=c
    j_id.
    16=LEADA201001005000X820001
    j_score.
    16=44,20,20,-21
    也就是課程保留了之前LMS返回給它的數(shù)據(jù),然后把最新的Score分?jǐn)?shù)添加到原來值的前面,至于這些值是用逗號(hào)隔開還是分號(hào)隔開取決于前門的LMS_AICC_VERSION值,值為3.5時(shí)分號(hào)隔開,2.2時(shí)逗號(hào)隔開。

    因?yàn)橄到y(tǒng)要用這些值統(tǒng)計(jì)學(xué)院的每次測(cè)試成績(jī),所以會(huì)注意到這些值的封裝方式。如果不需要使用這些值的話,就不用管了,只接簡(jiǎn)單的存取就是了
    posted @ 2009-05-20 16:36 George Gong 閱讀(299) | 評(píng)論 (0)編輯 收藏
         摘要:   PagePlayer.Properties General SCP Properties PagePlayerProperties.version=7.0.1 ...  閱讀全文
    posted @ 2009-05-20 16:08 George Gong 閱讀(596) | 評(píng)論 (0)編輯 收藏

    由于項(xiàng)目中用到,特在此做一筆記:

           1.Tomcat為6.0.14,解壓版。首先說明一點(diǎn):Tomcat本身是32位的,所以64位操作系統(tǒng)的話要覆蓋兩個(gè)文件。
               到http://svn.apache.org/viewvc/tomcat/tc6.0.x/tags/TOMCAT_6_0_14/res/procrun/amd64/  下載tomcat6.exe和tomcat6w.exe兩個(gè)文件。

           2.將上面下載的兩個(gè)文件覆蓋$TOMCAT_HOME/bin下對(duì)應(yīng)的文件。

           3.命令行到$TOMCAT_HOME/bin下,運(yùn)行service install命令。

           4.修改服務(wù)為自啟動(dòng),OK。


          PS:


          這里有點(diǎn)小問題,系統(tǒng)中用的Java為Oracle jrockit,所以安裝后的路徑同SUN的Java有所不同。而$TOMCAT_HOME/bin下的service.bat顯然是為SUN的Java準(zhǔn)備的,如下:

    rem Set the server jvm from JAVA_HOME
    set PR_JVM=%JAVA_HOME%\jre\bin\server\jvm.dll
    if exist "%PR_JVM%" goto foundJvm
    rem Set the client jvm from JAVA_HOME
    set PR_JVM=%JAVA_HOME%\jre\bin\client\jvm.dll
    if exist "%PR_JVM%" goto foundJvm
    set PR_JVM=auto
    :foundJvm
    echo Using JVM:              %PR_JVM%

        標(biāo)紅的是Sun Java的安裝路徑,而Jrockit為%JAVA_HOME%\jre\bin\jrockit\jvm.dll


        還有一點(diǎn)是:有的帖子說覆蓋文件前要先運(yùn)行tomcat6w.exe記錄下各參數(shù),其實(shí)完全沒必要。運(yùn)行server install命令后參數(shù)會(huì)自動(dòng)添入。
    posted @ 2009-03-31 17:32 George Gong 閱讀(3458) | 評(píng)論 (2)編輯 收藏

    1、使用system登錄Oracle,利用dbms_xdb修改端口設(shè)置

    SQL> -- Change the HTTP/WEBDAV port from 8080 to 8081
    SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get() , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()', 8081));


    Call completed.
    posted @ 2008-11-10 10:03 George Gong 閱讀(510) | 評(píng)論 (0)編輯 收藏
    鏈接為:http://www.zw1840.com/oracle/translation/concepts/index.htm

    收藏之
    posted @ 2008-01-30 17:39 George Gong 閱讀(422) | 評(píng)論 (0)編輯 收藏

    1.安裝AS4
        
        這個(gè)不多說,安裝過程沒什么難度。

    2.安裝Oracle10g

        AS4下安裝Oracle10g的文章一搜一堆,都是那幾個(gè)步驟:
        
        1、檢查oracle所需的RPM包是否齊全:

    gcc-3.2.3-34
    gcc-c++-
    3.2.3-34
    glibc-
    2.3.2-95.20
    make-
    3.79.1
    openmotif21-
    2.1.30-8
    setarch-
    1.3-1
    compat-db-
    4.0.14-5
    compat-gcc-
    7.3-2.96.128
    compat-gcc-c++-
    7.3-2.96.128
    compat-libstdc++-
    7.3-2.96.128
    compat-libstdc++-devel-
    7.3-2.96.128

        版本問題不大,大于等于都可以,沒有的在安裝盤或者Down下來裝上。

    2、建立oracle用戶及oinstall,dba用戶組:

    # /usr/sbin/groupadd oinstall /創(chuàng)建組用戶/
    # /usr/sbin/groupadd dba /創(chuàng)建組用戶/
    # /usr/sbin/useradd -g oinstall -G dba oracle /創(chuàng)建用戶,并設(shè)定用戶組/
    # passwd oracle /設(shè)定oracle用戶的密碼/

    3、修改oracle用戶的.bash_profile文件,將oracle相關(guān)的環(huán)境變量加進(jìn)去:

    ORACLE_BASE=/oracle/app
    ORACLE_HOME
    =$ORACLE_BASE/product/10.1.0/db_1
    ORACLE_SID
    =demo1
    PATH
    =$PATH:$HOME/bin:$ORACLE_HOME/bin
    LD_LIBRARY_PATH
    =$ORACLE_HOME/lib:/usr/lib
    export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH LD_LIBRARY_PATH


    4、修改系統(tǒng)屬性,在/etc/sysctl.conf文件中加入kernel相關(guān)的屬性配置:

    kernel.shmall = 2097152
    kernel.shmmax 
    = 2147483648
    kernel.shmmni 
    = 4096
    kernel.sem 
    = 250 32000 100 128
    fs.file-max 
    = 65536
    net.ipv4.ip_local_port_range 
    = 1024 65000
    net.core.rmem_default 
    = 262144
    net.core.rmem_max 
    = 262144
    net.core.wmem_default 
    = 262144
    net.core.wmem_max 
    = 262144

    這里重要的是kernel.shmmax,這里設(shè)置的值為2G,這個(gè)值跟oracle的SGA有很大關(guān)系,很容易出錯(cuò)。有的文章說這個(gè)值應(yīng)該設(shè)置成內(nèi)存的一半。另一個(gè)是kernel.shmall,有文章說這個(gè)值應(yīng)該是kernel.shmmax除以系統(tǒng)的PAGE_SIDE得到的商。

    5、根據(jù)步驟3里的設(shè)置創(chuàng)建相關(guān)目錄。

    6、修改redhat發(fā)行標(biāo)識(shí):
    由于oracle10g具有系統(tǒng)安裝監(jiān)測(cè),當(dāng)檢測(cè)到的系統(tǒng)不符合安裝配置規(guī)定的要求時(shí),安裝不能正常進(jìn)行,故要更改操作系統(tǒng)的版本標(biāo)識(shí),這一操作不會(huì)影響任何系統(tǒng)問題,可以在安裝結(jié)束后恢復(fù)為正常狀態(tài)。
    操作如下:
    備份/etc/redhat-release文件為/etc/redhat-release.bak
    以root權(quán)限修改/etc/redhat-release文件
    將文件的內(nèi)容Red Hat Enterprise Linux AS release 4 (Nahant)
    修改為Red Hat Enterprise Linux AS release 3 (Taroon)
    用于滿足 Disk1/install/oraparam.ini的檢查要求

    7、開始安裝
    這里可能會(huì)遇到一些問題,比如X-Windows啟動(dòng)不起來,這時(shí)候需要運(yùn)行命令:xhost+。如果IP是DHCP的話可能還需要修改local.localdomian的值。
    運(yùn)行oracle安裝盤里的runInstaller會(huì)出現(xiàn)安裝頁面,如果是亂碼的話還要設(shè)置系統(tǒng)的字符集。
    需要運(yùn)行orainstRoot.sh命令。
    接下來oracle要驗(yàn)證安裝需要的RPM包是否齊全,有的高級(jí)版本可能檢驗(yàn)不出來。
    安裝最后還要執(zhí)行root.sh命令。

    8、DBCA建庫問題
    這個(gè)問題因機(jī)器而異,在我的機(jī)器上出了問題,害我折騰了兩三天。在建表的時(shí)候,最后一步有SGA的設(shè)置,默認(rèn)選的是內(nèi)存的40%。我的機(jī)器的內(nèi)存是8G,40%是3G多,這樣就出問題了,開始建表操作后2%進(jìn)度的時(shí)候報(bào)ORA-27123錯(cuò)誤,說是sharedmomery問題,一開始弄的我一頭霧水,找不到北。有的文章提到32位的操作系統(tǒng)及Oracle,SGA應(yīng)該不高于1.7G,這是32位系統(tǒng)的上限。后來我把SGA調(diào)到小于1.7G就OK了。后來我試著更改kernel.shmmax的值,當(dāng)改為4G后再運(yùn)行DBCA建庫,會(huì)報(bào)ORA-27101(可能是這個(gè)號(hào)),out of memory的問題,內(nèi)存溢出。有文章說到應(yīng)該改limits.conf設(shè)置,去掉限制。但對(duì)此我還沒有進(jìn)行嘗試。

    9、Oracle的自啟動(dòng)
    在這個(gè)問題上我花費(fèi)了不少時(shí)間,一開始在/etc/init.d/目錄下建dbora啟動(dòng)腳本的時(shí)候有問題,系統(tǒng)重啟的時(shí)候一會(huì)執(zhí)行一會(huì)不執(zhí)行。后來根據(jù)別的文章采用令一種辦法:

    root 登錄,在  /etc/rc.d/init.d 下創(chuàng)建名為dbora,編輯增加以下內(nèi)容

    =================================================


    #!/bin/bash
    #參考http://staff.in2.hr/denis/oracle/10g1install_fedora3_en.html#n4_4
    # chkconfig: 
    35 95 1
    # description: init script to start/stop oracle database 10g
    , TNS listener, EMS
    #

    # match these values to your environment:
    export ORACLE_BASE
    =/u01/app/oracle
    export ORACLE_HOME
    =$ORACLE_BASE/10.2.0/db_1
    export ORACLE_SID
    =dssdb
    export PATH
    =/home/oracle/bin:$ORACLE_HOME/bin:$PATH
    export ORACLE_USER
    =oracle

    # see how we are called:
    case $
    1 in
        start)
        su - 
    "$ORACLE_USER"<<EOO
        dbstart
    EOS
        emctl start dbconsole
    EOO
        
    ;;

        stop)
        su - 
    "$ORACLE_USER"<<EOO
        dbshut
    EOS
        emctl stop dbconsole
    EOO
        
    ;;

        *)
        echo 
    "Usage: $0 {start|stop}"
        
    ;;
    esac


    ==========================

    打開終端執(zhí)行:
    chown oracle.oinstall /etc/rc.d/init.d/dbora
    chmod 
    755 /etc/rc.d/init.d/dbora

    使用chkconfig 設(shè)置運(yùn)行權(quán)限
    chkconfig dbora reset

    檢查
    chkconfig --list dbora
    結(jié)果如下:
    ora10            
    0:off   1:off   2:off    3:on    4:off    5:on    6:off

    這時(shí)你可以試試手動(dòng)啟動(dòng)及關(guān)閉oracle服務(wù):
    service dbora start
    service dbora stop

    總結(jié):
    現(xiàn)在的服務(wù)器配置越來越高,我的這臺(tái)機(jī)器是dell2950,4核CPU×2,8G內(nèi)存,64位。因?yàn)闆]有64位的redhat系統(tǒng)盤,只好操作系統(tǒng)及oracle都裝的32位的,這點(diǎn)很不爽。所以64位的硬件最好還是裝64位的系統(tǒng)及軟件,否則硬件上會(huì)有限制,不能充分利用。

    posted @ 2008-01-26 17:38 George Gong 閱讀(1892) | 評(píng)論 (1)編輯 收藏

    Oracle Server - Enterprise Edition - Version: 9.2.0.1 to 10.2.0.3
    Linux x86

    Symptoms

    ORA-27102, Out of memory error


    Cause

    For 32 bit system running smp kernel, we cannot have SGA > 1.7 GB directly. This is because of
    limitation of 32 bit systems of not being able to address memory > 4GB directly by a user process.
    If SGA is kept higher than 1.7 GB, it will results in ORA 27102 errors.

    While invoking dbca or creating starter database, by default it takes 40% of memory for SGA.
    Hence the size can accidentally exceed 1.7 GB




    Solution

    The workaround is to create a new database, and specify the size of SGA approximate to be 1.5 to
    1.7 GB.


    References

    Note 260152.1 - Summary About the Large SGA & Address Space on RH Linux

    Errors

    ORA-27102 out of memory

    posted @ 2008-01-26 15:17 George Gong 閱讀(1354) | 評(píng)論 (0)編輯 收藏
         摘要: http://www.theserverside.com/tt/articles/article.tss?l=IntrotoSpring25 October 2007                   ...  閱讀全文
    posted @ 2007-10-31 09:23 George Gong 閱讀(1217) | 評(píng)論 (0)編輯 收藏

    http://hmily.blueidea.com/archives/2007/4508.shtml

    目錄:
    一、術(shù)語session
    二、HTTP協(xié)議與狀態(tài)保持
    三、理解cookie機(jī)制
    四、理解session機(jī)制
    五、理解javax.servlet.http.HttpSession
    六、HttpSession常見問題
    七、跨應(yīng)用程序的session共享
    八、總結(jié)
    參考文檔

    一、術(shù)語session
    在我的經(jīng)驗(yàn)里,session這個(gè)詞被濫用的程度大概僅次于transaction,更加有趣的是transaction與session在某些語境下的含義是相同的。

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

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

    而到了web服務(wù)器蓬勃發(fā)展的時(shí)代,session在web開發(fā)語境下的語義又有了新的擴(kuò)展,它的含義是指一類用來在客戶端與服務(wù)器之間保持狀態(tài)的解決方案④。有時(shí)候session也用來指這種解決方案的存儲(chǔ)結(jié)構(gòu),如“把xxx保存在session 里”⑤。由于各種用于web開發(fā)的語言在一定程度上都提供了對(duì)這種解決方案的支持,所以在某種特定語言的語境下,session也被用來指代該語言的解決方案,比如經(jīng)常把Java里提供的javax.servlet.http.HttpSession簡(jiǎn)稱為session⑥。

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

    二、HTTP協(xié)議與狀態(tài)保持
    HTTP 協(xié)議本身是無狀態(tài)的,這與HTTP協(xié)議本來的目的是相符的,客戶端只需要簡(jiǎn)單的向服務(wù)器請(qǐng)求下載某些文件,無論是客戶端還是服務(wù)器都沒有必要紀(jì)錄彼此過去的行為,每一次請(qǐng)求之間都是獨(dú)立的,好比一個(gè)顧客和一個(gè)自動(dòng)售貨機(jī)或者一個(gè)普通的(非會(huì)員制)大賣場(chǎng)之間的關(guān)系一樣。

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

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

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

    三、理解cookie機(jī)制
    cookie機(jī)制的基本原理就如上面的例子一樣簡(jiǎn)單,但是還有幾個(gè)問題需要解決:“會(huì)員卡”如何分發(fā);“會(huì)員卡”的內(nèi)容;以及客戶如何使用“會(huì)員卡”。

    正統(tǒng)的cookie分發(fā)是通過擴(kuò)展HTTP協(xié)議來實(shí)現(xiàn)的,服務(wù)器通過在HTTP的響應(yīng)頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。

    而cookie 的使用是由瀏覽器按照一定的原則在后臺(tái)自動(dòng)發(fā)送給服務(wù)器的。瀏覽器檢查所有存儲(chǔ)的cookie,如果某個(gè)cookie所聲明的作用范圍大于等于將要請(qǐng)求的資源所在的位置,則把該cookie附在請(qǐng)求資源的HTTP請(qǐng)求頭上發(fā)送給服務(wù)器。意思是麥當(dāng)勞的會(huì)員卡只能在麥當(dāng)勞的店里出示,如果某家分店還發(fā)行了自己的會(huì)員卡,那么進(jìn)這家店的時(shí)候除了要出示麥當(dāng)勞的會(huì)員卡,還要出示這家店的會(huì)員卡。

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

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

    下面就是一個(gè)goolge設(shè)置cookie的響應(yīng)頭的例子
    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這個(gè)HTTP Sniffer軟件來俘獲的HTTP通訊紀(jì)錄的一部分

    瀏覽器在再次訪問goolge的資源時(shí)自動(dòng)向外發(fā)送cookie

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

    IE也可以設(shè)置在接受cookie前詢問

    這是一個(gè)詢問接受cookie的對(duì)話框。

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

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

    保存這個(gè)session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)揮給服務(wù)器。一般這個(gè)cookie的名字都是類似于SEEESIONID,而。比如weblogic對(duì)于web應(yīng)用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

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

    另一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。比如下面的表單
    <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>
    這種技術(shù)現(xiàn)在已較少應(yīng)用,筆者接觸過的很古老的iPlanet6(SunONE應(yīng)用服務(wù)器的前身)就使用了這種技術(shù)。
    實(shí)際上這種技術(shù)可以簡(jiǎn)單的用對(duì)action應(yīng)用URL重寫來代替。

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

    恰恰是由于關(guān)閉瀏覽器不會(huì)導(dǎo)致session被刪除,迫使服務(wù)器為seesion設(shè)置了一個(gè)失效時(shí)間,當(dāng)距離客戶端上一次使用session的時(shí)間超過這個(gè)失效時(shí)間時(shí),服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動(dòng),才會(huì)把session刪除以節(jié)省存儲(chǔ)空間。

    五、理解javax.servlet.http.HttpSession
    HttpSession是Java平臺(tái)對(duì)session機(jī)制的實(shí)現(xiàn)規(guī)范,因?yàn)樗鼉H僅是個(gè)接口,具體到每個(gè)web應(yīng)用服務(wù)器的提供商,除了對(duì)規(guī)范支持之外,仍然會(huì)有一些規(guī)范里沒有規(guī)定的細(xì)微差異。這里我們以BEA的Weblogic Server8.1作為例子來演示。

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

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

    復(fù)制嚴(yán)格說來不算持久化保存,因?yàn)閟ession實(shí)際上還是保存在內(nèi)存里,不過同樣的信息被復(fù)制到各個(gè)cluster內(nèi)的服務(wù)器進(jìn)程中,這樣即使某個(gè)服務(wù)器進(jìn)程停止工作也仍然可以從其他進(jìn)程中取得session。

    cookie生存時(shí)間的設(shè)置則會(huì)影響瀏覽器生成的cookie是否是一個(gè)會(huì)話cookie。默認(rèn)是使用會(huì)話cookie。有興趣的可以用它來試驗(yàn)我們?cè)诘谒墓?jié)里提到的那個(gè)誤解。

    cookie的路徑對(duì)于web應(yīng)用程序來說是一個(gè)非常重要的選項(xiàng),Weblogic Server對(duì)這個(gè)選項(xiàng)的默認(rèn)處理方式使得它與其他服務(wù)器有明顯的區(qū)別。后面我們會(huì)專題討論。

    關(guān)于session的設(shè)置參考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869

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


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

    由于session會(huì)消耗內(nèi)存資源,因此,如果不打算使用session,應(yīng)該在所有的JSP中關(guān)閉它。

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

    3、如何做到在瀏覽器關(guān)閉時(shí)刪除session
    嚴(yán)格的講,做不到這一點(diǎn)。可以做一點(diǎn)努力的辦法是在所有的客戶端頁面里使用javascript代碼window.oncolose來監(jiān)視瀏覽器的關(guān)閉動(dòng)作,然后向服務(wù)器發(fā)送一個(gè)請(qǐng)求來刪除session。但是對(duì)于瀏覽器崩潰或者強(qiáng)行殺死進(jìn)程這些非常規(guī)手段仍然無能為力。

    4、有個(gè)HttpSessionListener是怎么回事
    你可以創(chuàng)建這樣的listener去監(jiān)控session的創(chuàng)建和銷毀事件,使得在發(fā)生這樣的事件時(shí)你可以做一些相應(yīng)的工作。注意是session的創(chuàng)建和銷毀動(dòng)作觸發(fā)listener,而不是相反。類似的與HttpSession有關(guān)的listener還有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。

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

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

    7、開兩個(gè)瀏覽器窗口訪問應(yīng)用程序會(huì)使用同一個(gè)session還是不同的session
    參見第三小節(jié)對(duì)cookie的討論,對(duì)session來說是只認(rèn)id不認(rèn)人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲(chǔ)方式都會(huì)對(duì)這個(gè)問題的答案有影響。

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

    9、為什么在Weblogic Server中改變session的值后要重新調(diào)用一次session.setValue
    做這個(gè)動(dòng)作主要是為了在集群環(huán)境中提示W(wǎng)eblogic Server session中的值發(fā)生了改變,需要向其他服務(wù)器進(jìn)程復(fù)制新的session值。

    10、為什么session不見了
    排除session正常失效的因素之外,服務(wù)器本身的可能性應(yīng)該是微乎其微的,雖然筆者在iPlanet6SP1加若干補(bǔ)丁的Solaris版本上倒也遇到過;瀏覽器插件的可能性次之,筆者也遇到過3721插件造成的問題;理論上防火墻或者代理服務(wù)器在cookie處理上也有可能會(huì)出現(xiàn)問題。
    出現(xiàn)這一問題的大部分原因都是程序的錯(cuò)誤,最常見的就是在一個(gè)應(yīng)用程序中去訪問另外一個(gè)應(yīng)用程序。我們?cè)谙乱还?jié)討論這個(gè)問題。

    七、跨應(yīng)用程序的session共享

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

    然而按照Servlet規(guī)范,session的作用范圍應(yīng)該僅僅限于當(dāng)前應(yīng)用程序下,不同的應(yīng)用程序之間是不能夠互相訪問對(duì)方的session的。各個(gè)應(yīng)用服務(wù)器從實(shí)際效果上都遵守了這一規(guī)范,但是實(shí)現(xiàn)的細(xì)節(jié)卻可能各有不同,因此解決跨應(yīng)用程序session共享的方法也各不相同。

    首先來看一下Tomcat是如何實(shí)現(xiàn)web應(yīng)用程序之間session的隔離的,從 Tomcat設(shè)置的cookie路徑來看,它對(duì)不同的應(yīng)用程序設(shè)置的cookie路徑是不同的,這樣不同的應(yīng)用程序所用的session id是不同的,因此即使在同一個(gè)瀏覽器窗口里訪問不同的應(yīng)用程序,發(fā)送給服務(wù)器的session id也可以是不同的。

    根據(jù)這個(gè)特性,我們可以推測(cè)Tomcat中session的內(nèi)存結(jié)構(gòu)大致如下。

    筆者以前用過的iPlanet也采用的是同樣的方式,估計(jì)SunONE與iPlanet之間不會(huì)有太大的差別。對(duì)于這種方式的服務(wù)器,解決的思路很簡(jiǎn)單,實(shí)際實(shí)行起來也不難。要么讓所有的應(yīng)用程序共享一個(gè)session id,要么讓應(yīng)用程序能夠獲得其他應(yīng)用程序的session id。

    iPlanet中有一種很簡(jiǎn)單的方法來實(shí)現(xiàn)共享一個(gè)session id,那就是把各個(gè)應(yīng)用程序的cookie路徑都設(shè)為/(實(shí)際上應(yīng)該是/NASApp,對(duì)于應(yīng)用程序來講它的作用相當(dāng)于根)。
    <session-info>
    <path>/NASApp</path>
    </session-info>

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


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

    我們?cè)倏匆幌耊eblogic Server是如何處理session的。 

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

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

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

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

    值得注意的是這種用法不可移植,因?yàn)楦鶕?jù)ServletContext的JavaDoc,應(yīng)用服務(wù)器可以處于安全的原因?qū)τ赾ontext.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通過。

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

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

     

    posted @ 2007-10-29 13:15 George Gong 閱讀(371) | 評(píng)論 (0)編輯 收藏

    http://llying.javaeye.com/blog/129897

    function sendMessage()
    {
     //獲取name文本框的值
     var name = document.getElementById("name").value;
     //使用json格式調(diào)用遠(yuǎn)程java方法
     hello.hello(name,
     {
      //指定回調(diào)函數(shù)
      callback:cb,

      //指定超時(shí)時(shí)間
      timeout:5000,

      //指定錯(cuò)誤處理函數(shù),對(duì)于dwr1.x,如果服務(wù)端發(fā)生異常,該函數(shù)被激發(fā);從dwr2.0開始,服務(wù)端異常激發(fā)exceptionHandler函數(shù)。
      errorHandler:function(message){alert("Oops: " + message);},
      
      //當(dāng)因?yàn)闉g覽器bug引起的問題激發(fā)此函數(shù),該選項(xiàng)只有dwr2.0才支持。
      warningHandler:function(message){alert("Oops: " + message);},

      //當(dāng)服務(wù)器響應(yīng)不是正確的text/html頁時(shí),激發(fā)該函數(shù)。通常,超時(shí)也會(huì)激發(fā)該函數(shù)。
      textHtmlHandler:function(message){alert("Oops: " + message);},

      //遠(yuǎn)程調(diào)用失敗后激發(fā)該函數(shù)。通常服務(wù)器端處理異常或者數(shù)據(jù)轉(zhuǎn)換異常時(shí)會(huì)激發(fā)該函數(shù)。
      exceptionHandler:function(message){alert("Oops: " + message);},

      //指定發(fā)送請(qǐng)求的方法,分別是GET請(qǐng)求和POST請(qǐng)求。
      httpMethod:'POST',

      //指定是否發(fā)送異步請(qǐng)求。默認(rèn)值true,即使用異步請(qǐng)求。通常建議不使用同步請(qǐng)求。
      async:true,

      //指定遠(yuǎn)程調(diào)用方式,三個(gè)值DWREngine.XMLHttpRequest,DWREngine.Iframe,DWREngine.ScriptTag,分別使用XMLHttpRequest,Iframe,ScriptTag,默認(rèn)為XMLHttpRequest方式
      rpcType:DWREngine.XMLHttpRequest,
      
      //指定一個(gè)Hook函數(shù),該函數(shù)在遠(yuǎn)程調(diào)用之前被激發(fā)。
      preHook:function(){alert('遠(yuǎn)程調(diào)用之前.....')},

      //指定一個(gè)Hook函數(shù),該函數(shù)在遠(yuǎn)程調(diào)用之后被激發(fā)。
      postHook:function(){alert('遠(yuǎn)程調(diào)用之后.....')}
     });
    //回調(diào)函數(shù)
    function cb(data)
    {
     document.getElementById("show").innerHTML = data;
    }

    DWREngine.setOrdered(boolean)方法:true,嚴(yán)格限制響應(yīng)順序,默認(rèn)false;
    DWREngine.setTimeout(5000)方法:設(shè)置全局響應(yīng)時(shí)間
    DWREngine.setPreHook(preFun);
    DWREngine.setPostHook(postFun);

    posted @ 2007-10-26 10:14 George Gong 閱讀(1647) | 評(píng)論 (0)編輯 收藏

            由于項(xiàng)目需要用到Web Service,就采用了越來越火的CXF2.0。總得感覺是CXF2.0畢竟還是在Apache的孵化器中孕育,還沒有成熟,有很多不完善的地方。項(xiàng)目中采用CXF與Spring合用,比較簡(jiǎn)單,CXF本身的配置文件就是Spring配置文件,所以集成起來比較方便。CXF也提供了很多Sample。

            在開發(fā)中還是出現(xiàn)了一些問題,其中CXF用到了geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)
    ,官方說可以用JavaMail.jar替換,但是根本不行,因?yàn)間eronimo-javamail_1.4_spec-1.0-M1.jar不僅僅是Mail相關(guān)的Class,還有別的Class。不僅如此,此jar還與JavaMail1.4.jar沖突,由于我們項(xiàng)目中采用JavaMail-1.4.jar發(fā)郵件,項(xiàng)目中同時(shí)引用了這兩個(gè)jar,在junit中測(cè)試OK,但在Tomcat啟動(dòng)后就出現(xiàn)錯(cuò)誤了,仔細(xì)跟蹤,發(fā)現(xiàn)兩種方式中發(fā)短信分別用到了這兩個(gè)jar,在junit中用的是javamail-1.4.jar,沒有問題。在tomcat中發(fā)郵件是用到的是geronimo-javamail_1.4_spec-1.0-M1.jar ,二兩者實(shí)現(xiàn)的不同,根本不像CXF所說的可以替換,而且geronimo-javamail_1.4_spec-1.0-M1.jar 中實(shí)現(xiàn)發(fā)郵件的機(jī)制跟javamail還有不同,仔細(xì)跟蹤,發(fā)現(xiàn)問題出現(xiàn)在Session中,
    geronimo的javax.mail.Session中用到了屬性文件,它會(huì)把用戶設(shè)置的發(fā)短信的host改為localhost,這樣就會(huì)出現(xiàn)connect異常。最后把geronimo中的javax.mail中的所有class刪掉,測(cè)試發(fā)現(xiàn)發(fā)郵件和CXF Web Service 都OK。
    另外,Web Service 的安全采用了密鑰公鑰機(jī)制,用keytool制作了鑰匙,在CXF Web Service 以及遠(yuǎn)程訪問的Client中分別放置了jks文件。

    posted @ 2007-09-21 15:55 George Gong 閱讀(845) | 評(píng)論 (2)編輯 收藏

    在跟svn資源庫連接是eclipse非法關(guān)閉,JDK是BEA JRockit(R) R27.3.1-1-85830-1.5.0_11-20070716-1248-windows-ia32。日志如下:

    ===== BEGIN DUMP =============================================================
    JRockit dump produced after 0 days, 00:01:14 on Tue Sep 04 15:48:05 2007

    Additional information is available in:
      I:\eclipse\jrockit.3124.dump
      I:\eclipse\jrockit.3124.mdmp
    If you see this dump, please open a support case with BEA and
    supply as much information as you can on your system setup and
    the program you were running. You can also search for solutions
    to your problem at http://forums.bea.com in
    the forum jrockit.developer.interest.general.

    Error Message: Illegal memory access. [54]
    Exception Rec: EXCEPTION_ACCESS_VIOLATION (c0000005) at 0x066A7C0C - memory at 0x00000000 could not be read.
    Minidump     : Wrote mdmp. Size is 183MB
    SafeDllMode  : -1
    Version      : BEA JRockit(R) R27.3.1-1-85830-1.5.0_11-20070716-1248-windows-ia32
    GC Strategy  : Mode: throughput. Currently using strategy: genparpar
    GC Status    : OC is not running. Last finished OC was OC#1.
                 : YC is not running. Last finished YC was YC#2.
    OC History   : Strategy genparpar was used for OC#1.
    YC History   : Ran 2 YCs before OC#1.
                 : Ran 0 YCs since last OC.
    Heap         : 0x10100000 - 0x14100000
    Compaction   : 0x13D00000 - 0x14100000
    NurseryList  : 0x10106158 - 0x12706A28
    KeepArea     : 0x110FFFF0 - 0x118FFFE8
    NurseryMarker: [ 0x118FFFE8,  0x11DF6FD0 ]
    CompRefs     : References are 32-bit.
    CPU          : Intel Pentium 4 (HT) SSE SSE2 SSE3 NetBurst EM64T
    Number CPUs  : 2
    Tot Phys Mem : 1006047232 (959 MB)
    OS version   : Microsoft Windows Server 2003 version 5.2 Service Pack 1 (Build 3790) (32-bit)
    Thread System: Windows Threads
    State        : JVM is running
    Command Line : -Xmx512M
    java.home    : C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre
    j.class.path : I:\eclipse\plugins\org.eclipse.equinox.launcher_1.0.0.v20070606.jar
    j.lib.path   : I:\eclipse;.;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin\..\jre\bin\jrockit;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin\..\jre\bin;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin;D:\oracle\ora92\bin;C:\Program Files\Oracle\jre\1.3.1\bin;C:\Program Files\Oracle\jre\1.1.8\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\apache-ant-1.7.0\bin;C:\maven-2.0.7\bin;D:\maven-1.0.2\bin;C:\svn-win32-1.4.4\bin;C:\Program Files\QuickTime\QTSystem\
    JAVA_HOME    : C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11
    _JAVA_OPTIONS: <not set>
    PATH         : C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin\..\jre\bin\jrockit;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin\..\jre\bin;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin;D:\oracle\ora92\bin;C:\Program Files\Oracle\jre\1.3.1\bin;C:\Program Files\Oracle\jre\1.1.8\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\apache-ant-1.7.0\bin;C:\maven-2.0.7\bin;D:\maven-1.0.2\bin;C:\svn-win32-1.4.4\bin;C:\Program Files\QuickTime\QTSystem\
    C Heap       : Good; no memory allocations have failed
    StackOverFlow: 0 StackOverFlowErrors have occured
    OutOfMemory  : 0 OutOfMemoryErrors have occured

    Registers (from ThreadContext: 0x066872B0 / OS context: 0x06687AB8):
       eax = 0207f508    ecx = 00000000    edx = 00000000    ebx = 00000000
       esp = 06687d84    ebp = 06687d90    esi = 008fc980    edi = 00000000
        es = 00000023     cs = 0000001b     ss = 00000023     ds = 00000023
        fs = 0000003b     gs = 00000000
       eip = 066a7c0c eflags = 00010246

    Stack:
    (* marks the word pointed to by the stack pointer)
    06687d84: 00000000* 008fc980  0207f508  06689dbc  06691f32  06689db8 
    06687d9c: 0207f508  00000000  00000000  00000000  008fc980  0207f508 
    06687db4: 00000000  0207f508  00000000  0207f508  0207f5a8  6eec84f1 
    06687dcc: 0207f508  00000010  6ee40000  6eec11f2  0207f508  0207f5a8 

    Code:
    (* marks the word pointed to by the instruction pointer)
    066a7bdc: 850c458b  8b0b75c0  6bd6e80d  0c4d8906  4d8bc18b  75c98510 
    066a7bf4: 74c0850a  20508b06  53105589  56145d8b  75db8557  18588b03 
    066a7c0c: 01bf038b* 3b000000  19820fc7  8b000001  c0850c43  e8500674 
    066a7c24: fffff168  8b18738b  18438d0b  f685d78b  d13b0f75  708b0b73 

    Loaded modules:
    (* denotes the module causing the exception)
    00400000-0040cfff  I:\eclipse\eclipse.exe
    7c930000-7c9fffff  C:\WINDOWS\system32\ntdll.dll
    7c800000-7c92afff  C:\WINDOWS\system32\kernel32.dll
    77e10000-77ea0fff  C:\WINDOWS\system32\USER32.dll
    77bd0000-77c18fff  C:\WINDOWS\system32\GDI32.dll
    77f30000-77fdbfff  C:\WINDOWS\system32\ADVAPI32.dll
    77c20000-77cbefff  C:\WINDOWS\system32\RPCRT4.dll
    77370000-77406fff  C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.2778_x-ww_497C098C\COMCTL32.dll
    77b70000-77bc9fff  C:\WINDOWS\system32\MSVCRT.dll
    76180000-7619cfff  C:\WINDOWS\system32\IMM32.DLL
    63090000-63098fff  C:\WINDOWS\system32\LPK.DLL
    74ae0000-74b40fff  C:\WINDOWS\system32\USP10.dll
    10000000-10010fff  I:\eclipse\plugins\org.eclipse.equinox.launcher.win32.win32.x86_1.0.0.v20070523\eclipse_1017a.dll
    77b60000-77b67fff  C:\WINDOWS\system32\VERSION.dll
    71ad0000-71b04fff  C:\WINDOWS\system32\uxtheme.dll
    4b210000-4b260fff  C:\WINDOWS\system32\MSCTF.dll
    75d60000-75d86fff  C:\WINDOWS\system32\apphelp.dll
    4c510000-4c53dfff  C:\WINDOWS\system32\msctfime.ime
    774b0000-775e3fff  C:\WINDOWS\system32\ole32.dll
    00b00000-00d91fff  C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\jrockit\jvm.dll
    769e0000-76a09fff  C:\WINDOWS\system32\WINMM.dll
    71b60000-71b76fff  C:\WINDOWS\system32\WS2_32.dll
    71b50000-71b57fff  C:\WINDOWS\system32\WS2HELP.dll
    7c340000-7c395fff  C:\WINDOWS\system32\MSVCR71.dll
    76eb0000-76ec2fff  C:\WINDOWS\system32\Secur32.dll
    6d710000-6d71bfff  C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\verify.dll
    6d380000-6d39cfff  C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\java.dll
    6d300000-6d307fff  C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\hpi.dll
    6d730000-6d73efff  C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\zip.dll
    6d540000-6d552fff  C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\net.dll
    71a80000-71abffff  C:\WINDOWS\system32\mswsock.dll
    69660000-696b5fff  C:\WINDOWS\system32\hnetcfg.dll
    71a40000-71a47fff  C:\WINDOWS\System32\wshtcpip.dll
    6d560000-6d568fff  C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\nio.dll
    76ab0000-76abafff  C:\WINDOWS\system32\psapi.dll
    02d60000-02daefff  I:\eclipse\configuration\org.eclipse.osgi\bundles\13\1\.cp\swt-win32-3346.dll
    77cd0000-77dd2fff  C:\WINDOWS\WinSxS\X86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.3790.2778_x-ww_A8F04F11\COMCTL32.dll
    77eb0000-77f01fff  C:\WINDOWS\system32\SHLWAPI.dll
    761a0000-761e7fff  C:\WINDOWS\system32\comdlg32.dll
    02dc0000-035a0fff  C:\WINDOWS\system32\SHELL32.dll
    775f0000-7767bfff  C:\WINDOWS\system32\OLEAUT32.dll
    779e0000-77a83fff  C:\WINDOWS\system32\WININET.dll
    035b0000-03640fff  C:\WINDOWS\system32\CRYPT32.dll
    03650000-03661fff  C:\WINDOWS\system32\MSASN1.dll
    749c0000-749eefff  C:\WINDOWS\system32\oleacc.dll
    780c0000-78120fff  C:\WINDOWS\system32\MSVCP60.dll
    04cf0000-04d03fff  I:\eclipse\configuration\org.eclipse.osgi\bundles\13\1\.cp\swt-gdip-win32-3346.dll
    4c620000-4c7c6fff  C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.3790.1830_x-ww_24C40C58\gdiplus.dll
    04fc0000-05508fff  C:\WINDOWS\system32\xpsp2res.dll
    003d0000-003d4fff  C:\WINDOWS\system32\msimg32.dll
    6eec0000-6eee0fff  I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libapr.dll
    6ee50000-6ee58fff  I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libapriconv.dll
    05b10000-05c17fff  I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libeay32.dll
    01c60000-01c6afff  C:\WINDOWS\system32\WSOCK32.dll
    05c20000-05ce3fff  I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libdb44.dll
    05cf0000-05d20fff  I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\ssleay32.dll
    6ee60000-6ee88fff  I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libaprutil.dll
    03a80000-03a91fff  I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\intl3_svn.dll
    05d30000-05e38fff  I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libsvnjavahl-1.dll
    76610000-76618fff  C:\WINDOWS\system32\SHFOLDER.dll
    05e70000-0603ffff  C:\WINDOWS\system32\UNISPIM5.IME
    6ee40000-6ee44fff  C:\svn-win32-1.4.4\iconv\_tbl_simple.so
    06690000-06698fff  C:\svn-win32-1.4.4\bin\libapriconv-1.dll
    066a0000-066bffff *C:\svn-win32-1.4.4\bin\libapr-1.dll
    066c0000-067d2fff  C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\dbghelp.dll


    "ModalContext" id=23 idx=0x58 tid=2184 lastJavaFrame=0x0668EAC4

    Stack 0: start=0x06590000, end=0x06690000, guards=0x06593000 (ok), forbidden=0x06591000
    Thread Stack Trace:
        at _apr_pool_create_ex@16+60()@0x066A7C0C
        at apr_iconv_mod_load+434()@0x06691F32
        at apr_iconv_mod_load+36()@0x06691DA4
        at apr_iconv_mod_load+316()@0x6EE51EFC
        -- Java stack --
        at org/tigris/subversion/javahl/SVNClient.info2(Ljava/lang/String;Lorg/tigris/subversion/javahl/Revision;Lorg/tigris/subversion/javahl/Revision;Z)[Lorg/tigris/subversion/javahl/Info2;(Native Method)
        at org/tigris/subversion/svnclientadapter/javahl/AbstractJhlClientAdapter.getInfo(AbstractJhlClientAdapter.java:1513)
        at org/tigris/subversion/svnclientadapter/AbstractClientAdapter.getInfo(AbstractClientAdapter.java:225)
        at org/tigris/subversion/subclipse/core/repo/SVNRepositoryLocation.validateConnection(SVNRepositoryLocation.java:407)
        at org/tigris/subversion/subclipse/ui/wizards/NewLocationWizard$1.run(NewLocationWizard.java:83)
        at org/eclipse/jface/operation/ModalContext$ModalContextThread.run(ModalContext.java:113)
        at jrockit/vm/RNI.c2java(IIIII)V(Native Method)
        -- end of trace

    Additional information is available in:
      I:\eclipse\jrockit.3124.dump
      I:\eclipse\jrockit.3124.mdmp
    If you see this dump, please open a support case with BEA and
    supply as much information as you can on your system setup and
    the program you were running. You can also search for solutions
    to your problem at http://forums.bea.com in
    the forum jrockit.developer.interest.general.
    ===== END DUMP ===============================================================

    由上面的紅色字可以看出,eclipse的subclipse插件在運(yùn)行時(shí)調(diào)用了C盤下的subversion中的dll文件,故產(chǎn)生內(nèi)容溢出的問題。這個(gè)現(xiàn)象不太容易出現(xiàn),因?yàn)镾VN服務(wù)器一般都在別的機(jī)器上。但發(fā)生這種情況還是很詭異,難道SVN的開發(fā)者沒有出現(xiàn)過類似問題么?SVN版本為1.4.4,subclipse插件為1.2.4,不記得以前的版本是否也存在這樣的沖突。
     


     

    posted @ 2007-09-04 16:43 George Gong 閱讀(8140) | 評(píng)論 (1)編輯 收藏
    最近一直在整linux,VMWare中裝上了Solaris10 和 SUSE10.1,后來覺得很不爽,有點(diǎn)慢,決定裝雙系統(tǒng)。一開始裝UBUNTO6,裝的還挺順利,但后來的屏幕刷新率怎么也提高不上去。本人的機(jī)器是PM900M的集成顯卡,驅(qū)動(dòng)極其難裝,搞了兩天也沒搞定,一狠心把UBUNTO刪了。接下來準(zhǔn)備裝SUSE,這次更不爽,不論是光驅(qū)安裝還是硬盤都不行。光驅(qū)安裝:進(jìn)入后就找不到硬盤和光驅(qū)了,本人的硬盤是ST3160811AS串口硬盤,現(xiàn)在才發(fā)現(xiàn)硬件還真不好弄,以后買機(jī)器一定要找最普通的硬件。。。
    posted @ 2007-08-31 15:05 George Gong 閱讀(174) | 評(píng)論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲av永久无码精品秋霞电影影院| 巨波霸乳在线永久免费视频| 精品在线视频免费| 亚洲av无码专区青青草原| 亚洲国产成人精品无码区花野真一 | 国产综合免费精品久久久| 三年片免费观看大全国语| 91精品成人免费国产| 曰批全过程免费视频在线观看无码 | 亚洲视频一区在线播放| 亚洲成aⅴ人片在线影院八| 91亚洲视频在线观看| 在线aⅴ亚洲中文字幕| 亚洲欧美日韩久久精品| 国产精品亚洲专区无码唯爱网| 午夜亚洲WWW湿好爽| 未满十八私人高清免费影院| 97国免费在线视频| 久久国产精品免费网站| 久草视频在线免费| 永久黄网站色视频免费直播| 全部免费国产潢色一级| 亚洲国产精品无码久久青草| 亚洲精品成人网站在线观看| 亚洲一区综合在线播放| 国产AV旡码专区亚洲AV苍井空| 青青青亚洲精品国产| 91在线免费视频| 成人女人A级毛片免费软件| 国产又粗又长又硬免费视频| 久久激情亚洲精品无码?V| 亚洲欧洲在线观看| 精品国产成人亚洲午夜福利| 无码毛片一区二区三区视频免费播放| 三级网站在线免费观看| 思思re热免费精品视频66| 免费一级毛片不卡不收费| 亚洲国产成人久久综合一| 中文字幕在线日亚洲9| 好猛好深好爽好硬免费视频| 91精品国产免费|