系统为RH linux9+jdk1.5+Apache2+JK1.2+Tomcat5.5.9
应用程序采用jsp编写,在程序中用到Session,如果在客户端把用户的IE隐私设置为最高,那么系统的Session ID就会丢失,从而在相关的程序中无法获取到session信息,在服务器段出现如下错误异常。
2005-11-10 15:16:21,399 - org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/aaa].[jsp] -879253 [TP-Processor9] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/aaa].[jsp] - Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.loginIcc_jsp._jspService(org.apache.jsp.loginIcc_jsp:85)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:307)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:385)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:748)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:678)
at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:871)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
该异常不会影响Tomcat服务器的正常运行,也不影响别的用户的使用,但是该客户的应用程序无法使用,该问题可以解决。可以在jsp页面连接的地方采用页面重发的机制,可以解决掉客户端关闭cookie而引起的session ID丢失的问题。
具体如下:
原理是客户端页面会判断本地是否开放cookie,如果开放的话,系统就会把session id以cookie的形式保存;如果本地拒绝保存cookie(用户为了安全考虑,把本地cookie功能关闭),那么页面将通过参数形式传递session id,从而保证sessin 不丢失,这样可以解决关闭cookie的那些用户的问题。
如果要解决该问题需要每个页面添加重发功能。
具体代码如下:
<%@ page session="true" %>
<%
String url =response.encodeURL("连接页面.jsp");
%>
<a href='<%=url%>'>连接页面</a>
如果重定向,则采用如下方法:
response.encodeRedirectURL ()
如果采用struts框架开发的系统,只要把XXX.do当作一个jsp页面同样来处理就可以。