今天,在用Servlet做注销控制时,遇到一个很奇怪的问题,就是该Servlet不能正常注销登陆。经过测试发现,该servlet根本就没有被访问。开始还以为是web.xml的配置问题,或是我tomcat的配置问题,导致它没有指向正确的Servlet。可无论如何修改配置,都无济于事。
在朋友提醒下,可能是缓存的问题,但是如果是缓存问题,为什么只有这个Servlet有这个问题,而其他的没有呢?抱着试一试的态度,我在跳转到该URL里加入了一个随机参数,这次该Servlet可以正常注销了。问题虽然解决了,可原因却还没找到。
为了测试Servlet究竟会在什么情况下存在缓存问题,我开始做测试。首先新建一个Servlet,然后在它的doGet方法里,添加打印随机值的语句。结果每次运行,它都能输出不同的值,并没有缓存问题。我就猜想,会不会是访问方式的问题,我每次测试都是在地址栏直接输入然后敲回车的,这其实已经带着刷新的效果了。于是我又新建了一个页面,用一个超链指向该页面。重新测试,发现仍然每次输出。
问题到这一步似乎僵住了,然后认真分析出问题的servlet与测试所用的Servlet有什么不同。突然想起,出问题的Servlet并不输出页面,而是会跳转到一个静态的html页面。会不会是浏览器因为它返回来的是一个静态页面,浏览器认为没必要去访问服务器,所以才缓存的呢?再次尝试,将测试Servlet改为跳转到另一个html的页面的功能。测试,这次问题出现了,在大部分情况下,都没有再输出随机值,说明服务端的Servlet并没有被访问。同时尝试让它跳转到一个jsp页面,发现如此的话,该Servlet仍然会被每次访问。看来,缓存问题主要还是出现于Servlet向普通的html页面跳转中。
问题解决了,原因也差不多搞明白了,这里还剩下最后一个问题。就是在测试Servlet中,缓存问题值存在于第二次以后,但问题Servlet的缓存问题在第一次访问也存在。另外测试Servlet的访问次数也要多与问题Servlet。这个问题留待以后再去想明白吧。