java - 为什么在 Java servlet 的 session 中设置属性有时会失败?

标签 java jsp tomcat servlets

我正在开发一个相当简单的 Web 应用程序,它使用 JSP 和 Java servlet,在 tomcat 上运行。我已经能够在 servlet 的 session 中设置属性,以便将信息传递给 JSP,然后将其呈现给用户。我已经用不同类的几个不同对象完成了此操作,并且效果很好。突然间,当我设置特定类型的对象(包含配置信息)时,该属性根本没有显示在 JSP 中。我设置的其他属性仍然存在,但是配置对象完全丢失了。我打印了属性名称列表,但我使用的名称甚至不存在(尽管我设置的其他属性的其他名称存在)。

什么会导致这种情况?我的配置类没有什么不同或奇怪的地方。我真的很感激任何关于什么样的事情可能导致这种行为的想法。我用谷歌搜索了一遍,但找不到任何东西。

预计到达时间:如果重要,属性的名称是“配置”。我找不到任何关于保留字或任何东西的信息......我在 servlet 中将此属性设置为与其他一些功能(如“用户”)相同的功能。然后我重定向到一个试图获取用户和配置的 JSP。所以一切都在同时进行。用户很好,而配置甚至没有出现在属性名称列表中。

ETA2:这是日志中不断出现的异常:

java.lang.Exception
    at pms.SessionListener.printStackTrace(Unknown Source)
    at pms.SessionListener.attributeAdded(Unknown Source)
    at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1498)
    at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1390)
    at org.apache.catalina.session.StandardSessionFacade.setAttribute(StandardSessionFacade.java:154)
    at PMS.getTaskInfo(Unknown Source)
    at PMS.doGet(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:282)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:357)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1687)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

最佳答案

根据对问题的评论:

The session is absolutely there, and I can retrieve other attributes that were set in the servlet at the same time from the session in the JSP. It's just this one particular attribute that won't show up. I found lots of stuff on the session not being there, but not why one attribute won't work when others do.

然后某事删除或取消了该属性。

session.removeAttribute("name");

session.setAttribute("name", null);

甚至在 JSP 中

<c:set var="name" value="${null}" scope="session" />

或者可能是您自己设置了 null 而不是 fullworthy 对象。

为了更好地确定一个和另一个,我会让属性实现 HttpSessionBindingListener并将堆栈转储到 valueUnbound() 上。

public class Foo implements HttpSessionBindingListener {

    @Override 
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("Value bound"); // Logger?
    }

    @Override 
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.err.println("Value unbound"); // Logger?
        Thread.dumpStack();
    }

    // ...
}

关于java - 为什么在 Java servlet 的 session 中设置属性有时会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5505892/

相关文章:

java - 如何阻止属性类以不合逻辑的顺序输出到文件。解决方法?

java - JAVA-如何从for循环外部访问FOR循环内部的变量

java - 如何在javax.websocket服务器中获取远程客户端地址?

jsp - Tomcat 404 未找到错误

java - 在 Eclipse 中清理 Tomcat 的工作目录

java - java中取用户输入的单词的第一个字母并重复添加到末尾

java - Spring MVC中如何返回JSP选择框的值?

java - 从 Content-Disposition 获取文件名

java - 无法连接到 ec2 tomcat 本地主机

java - 使用 Java 标准 keystore 是一种不好的做法吗