自己启动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/