我开发了一个系统,在本地测试都没有问题,但是放到远程数据库上系统就一直崩溃,经测试原因似乎是出在登录后找不到记录登录用户信息的session上,我的源代码是这样的
LoginAction.java:(部分代码)HttpSession session = request.getSession(false); if (session != null) { session.invalidate();
}
UserContainer existingContainer = new UserContainer();
session = request.getSession(true);
existingContainer.setUserView(userView);
synchronized (this) {
session.setAttribute(
IConstants.USER_CONTAINER_KEY,
existingContainer);
}
以上是登录的servlet,主要是将登陆者的信息放到session上,登录的首页显示没有问题,但是一旦访问了带有读取session信息的servlet的时候就开始出错了,比如说这样的servlet, UserContainer existingContainer = null; existingContainer = getUserContainer(request);
qryResultContainerHm = existingContainer.getQryResultContainerHm();
UserView userView = existingContainer.getUserView();
long userid = userView.getUser_id();一到 这里系统就崩掉了。
有的时候 到这里 if (request.getSession().getAttribute(IConstants.USER_CONTAINER_KEY)
== null) {
errors.add(
ActionErrors.GLOBAL_ERROR,
new ActionError(IConstants.ERROR_SESSIONINVALIDATION_KEY));
saveErrors(request, errors);
return mapping.findForward(IConstants.AUTHENTICATE_KEY);
} 也报错,有的时候还出现数据库链接失败的提示
所以我怀疑是出在session上面,请各位大虾帮帮忙,帮我看看是什么原因引起的?问题的关键是为什么本地测试都没有问题,到了服务器上就不行了

解决方案 »

  1.   

    9494
    用try{}catch()详细的错误!
    可能服务器的配置不同
      

  2.   

    这个是数据库链接报错:
    javax.servlet.ServletException
    org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    root cause java.sql.SQLException
    com.ems.struts.util.DBConnection.getConnection(DBConnection.java:42)
    com.ems.struts.bodao.UserBODAO.findByNamePwd2(UserBODAO.java:232)
    com.ems.struts.service.EmsServiceImpl.authenticateLogin2(EmsServiceImpl.java:142)
    com.ems.struts.action.LoginAction.execute(LoginAction.java:73)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)这个是session报错:
    javax.servlet.ServletException
    org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    root cause java.lang.NullPointerException
    com.ems.struts.action.FindAllExhiAction.execute(FindAllExhiAction.java:99)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
      

  3.   

    我给大家地址 大家可以试试 http://ems.haistand.net  username:admin   pwd:111111
      

  4.   

    错误问题比较多
    你做一下try 处理 尽量全面些
    然后输出异常~~
      

  5.   

    连不上去。程序的bug(即在某些上下文中的逻辑问题)造成的。建议,使用与服务器相同的场景测试。我觉得可能是服务器或数据不同。建议,开服务器的远程调试。
    然后在eclipse中远程调试。
      

  6.   

    最终的问题是
    java.sql.SQLException
    com.ems.struts.util.DBConnection.getConnection(DBConnection.java:42)检查DBConnection.getConnection这个方法
      

  7.   

    刚刚我在远程服务器上装了eclipse,结果创建项目的时候它报项目 ems 中具有不受限制的类路径变量“TOMCAT_HOME/common/lib/jasper-runtime.jar”
    项目 ems 中具有不受限制的类路径变量“TOMCAT_HOME/common/lib/jsp-api.jar”
    项目 ems 中具有不受限制的类路径变量“TOMCAT_HOME/common/lib/servlet-api.jar”
    在解决构建路径错误之前不能构建该项目是不是这个原因呢?这是什么意思呢
      

  8.   

    我测试过了,从loginAction都是正常的,userView也保存到了session中,但是到了existingContainer = getUserContainer(request);这句的时候userView=null了 这是怎么回事
      

  9.   

    谢谢大家的关注,周末我做了下服务器端的调试,发现了问题的根源:
    登录的脚本没有问题
    HttpSession session = request.getSession(false);if (session != null) {session.invalidate();
    }
    UserContainer existingContainer = new UserContainer();
    session = request.getSession(true);
    existingContainer.setUserView(userView);
    synchronized (this) {
    session.setAttribute(
    IConstants.USER_CONTAINER_KEY,
    existingContainer);
    },到这里session中是有existingContainer,的,request也正常,然后登录后的定向到findallcustomer.do
    public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws Exception {
    ......
    UserContainer existingContainer = null; existingContainer = getUserContainer(request);
    qryResultContainerHm = existingContainer.getQryResultContainerHm();
    UserView userView = existingContainer.getUserView();
    long userid = userView.getUser_id();
    .......}
    到这里request还是正常,request中的session还是记录着existingContainer,里面也有userView,可是当我访问其他的servlet的时候,比如findallexhi.do
    public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws Exception {
    ......
    从HttpServletRequest request这里开始request中的session就没有了existingContainer,当然也就没有了userView,导致了程序到了 long userid = userView.getUser_id();报错了,请问这是怎么一回事?哪位大虾指点一下,重申一下,以上的问题只是在远端服务器上出现,在本地测试都是正常的
      

  10.   

    session的丢失跟配置的有没有关系?
      

  11.   

    很可能你的数据库服务器设置了IP地址效验,例如MYSQL如果设置为localhost访问那么就只能本地访问,如果你从远程来访问的话....嘿嘿,不SQLException才怪
      

  12.   

    你服务器配置路径啊之内的有没问题呢?换了机子就不行了。那一般来说是哪个工具没配置好吧..,检查下配置有没不对的端口有没冲突的,你本地访问用的localhost吧?你有试过本地远程饶回来访问你自己的机子没呢?
      

  13.   

    感谢大家的关注,我的问题终于解决了,说来其实也很简单,其实是因为我在jsp中的某些超连接加上了项目名称的缘故,比如/ems/aaa.do,是不是java在接收这个超连接的时候误认为是转到了另一个应用上了,我们知道session不会在应用上传递的,所以导致了我说的session的丢失,不过我不知道为什么本地没有这样的问题,放到其他服务器上就有这样的问题,不管怎么样,问题还是解决了,感谢大家的帮助!我最后回下贴也希望给跟我有同样困扰的朋友有所帮助,就此结贴。