【问题标题】:Why does keyword "transient" has no effect for Servlet HTTPSession in Java?为什么关键字“transient”对 Java 中的 Servlet HTTPSession 没有影响?
【发布时间】:2017-01-23 07:12:40
【问题描述】:

transient 关键字究竟是什么意思?我有一个标记为瞬态的 Class 属性:

public class NodeClassifier {

   private transient HashMap<String, Node> nodeCache = new HashMap<>();

...
}

在将 NodeClassifier 对象存储并恢复到 HttpSession 之后,属性仍然具有上一个会话的值。

不应该是空的吗?

Environment 是一个在 Glassfish4 上运行的普通 Servlet。

【问题讨论】:

标签: java servlets


【解决方案1】:

transient 表示当对象作为字节写出时,该值不会被序列化(使用默认的 Java 对象序列化)。

会话的序列化可能会发生也可能不会发生(它只需要在进程之间传递会话,或者将其持久化到磁盘,但通常不需要在可以将它们保存在内存中的单个 JVM servlet 容器中),所以你不应该依赖这种方式“丢失”的价值观。

如果您不希望内容在会话中存活,请不要将其放在那里。 考虑改用请求属性。

【讨论】:

  • 好的,明白了。如果服务器决定序列化它可能会丢失,但如果服务器将会话保存在内存中,它不会丢失,对吧?所以瞬态实际上只是为了限制会话存储。将某些内容放入会话时,是否有默认的清理属性的方法?一些回调或类似的?还是我需要手动编码。
  • 请求属性对我不起作用,因为它是一个嵌套的对象结构,并且一个对象有一个“缓存”,需要在会话中持久化时清除。
  • 不,transient 是一种使序列化工作的低级机制。它并非旨在限制会话存储。会话应该存储您放入其中的所有内容。
  • 如果现有的范围(会话、请求、页面、ThreadLocal)对你来说不够用,那么,是的,你需要手动编码。您当然可以有一个请求过滤器,以便在处理每个请求之前或之后从会话中删除内容。
  • 好的,谢谢。我有一个“存储库”类从会话中读取和写入此对象,我将在其中添加它。
猜你喜欢
  • 2014-01-09
  • 2011-07-11
  • 2013-01-18
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2019-09-28
相关资源
最近更新 更多