自己啟動(dòng)jetty所遇到的 session reset 問題
在eclipse 當(dāng)中啟動(dòng)的 jetty 時(shí),由于要根據(jù) extension point 來找到
相應(yīng)的 servlet 定義和 mapping,因此自己取得一個(gè) context,然后往里面
addHandler。開始只有一個(gè) servlet ,沒有問題,后來又有兩個(gè)plugin,其中
也有servlet/mapping的定義,然后就總是出現(xiàn) session reset 的問題。
開始還以為是自己做的classloader 的問題,因?yàn)閾?dān)心自己做的 loader 會(huì)產(chǎn)生
不好的影響。后來把日志級別調(diào)高之后,發(fā)現(xiàn)如果連續(xù)只訪問一個(gè)servlet, 就不會(huì)
有 session reset 問題,如果這時(shí)候再訪問另一個(gè) servlet,它就會(huì)賦予另外一個(gè)
session id。再仔細(xì)看了一下增加 servlet mapping 的代碼:
for (ExtensionBean bean : servletMappingBeans) {
ServletHandler handler = new ServletHandler();
handler.addServlet( bean.getProperty( "mapping"), bean.getClassName());
context.addHandler( handler);
}
這樣,相當(dāng)于在 context 里面增加了多個(gè) servlet handler,每個(gè)handler有一個(gè)自己的
session manager,由此導(dǎo)致訪問不同的 servlet,使用不同的session id 的問題,從而
導(dǎo)致客戶端認(rèn)為 session reset 了。因此,稍微修改一下就解決了這個(gè)問題:
ServletHandler handler = new ServletHandler();
for (ExtensionBean bean : servletMappingBeans) {
handler.addServlet( bean.getProperty( "mapping"), bean.getClassName());
}
context.addHandler( handler);
教訓(xùn):一開始就覺得這個(gè)問題不是個(gè)大問題,但是由于在后臺老是沒有異常,日志文件中也
沒有提供足夠的信息,因此一開始花了很長時(shí)間進(jìn)行調(diào)試和單步跟蹤(雖然不喜歡,但是當(dāng)時(shí)
也沒有想出其他辦法)。后來把日志級別提高了,把jetty的debug enable之后,發(fā)現(xiàn)訪問
不同的servlet將造成session id 的變化,從而很快的定位到問題并且解決問題。
也就是說,碰到問題,還是應(yīng)該冷靜,盡量用日志去定位問題,而不是用debug去定位問題。
主站:
http://blogsite.3322.org/jspwiki/