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