当前位置: 首页 > 知识库问答 >
问题:

WebLogic 12c是否使用setAtort方法破坏了Http会话API合约?

胡昊
2023-03-14

我目前正在将一个JavaEE5(WL10.3.5)应用程序迁移到JavaEE7(WL12.2.1),我面临一个奇怪的问题。

方法HttpSession的WebLogic 12c实现。如果对象相同(根据WL12c的实现相同),setAttribute(字符串,对象)不会用新对象替换绑定到同一字符串键的旧对象。

经过多次测试后,当您想替换会话中的对象时,WL12c比较哈希代码如果它们相同,它会比较对象whith equals()。If equals()返回“true”,WL12c不会替换对象!

但是JavaEE 7 Api doc中没有这样的信息:setAtort(String, Object)

使用指定的名称将对象绑定到此会话。如果已将同名对象绑定到会话,则会替换该对象。

根本没有提到“仅当要替换的对象根据hashCode和equals方法不同时”。

示例测试,假设我们有一个类MyClass

import org.apache.commons.lang.builder.HashCodeBuilder;

class MyClass{
    private Long id;
    private String myProperty;

    private static final int HASHCODE1 = -459751453;
    private static final int HASHCODE2 = 981454267;

    public MyClass(Long id, String myProperty) {
        this.id = id;
        this.myProperty = myProperty;
    }

    // Override equals based on the id only
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || this.getClass() != obj.getClass()) {
            return false;
        }
        MyClass myClass = (MyClass) obj;

        if (this.getId() != null) {
            return this.getId().equals(myClass.getId());
        }
        return false;
    }

    // Override hashCode based only on id
    @Override
    public int hashCode() {
    return new HashCodeBuilder(HASHCODE1, HASHCODE2).append(this.getId()).toHashCode();
    }
    /* Getters & Setters*/
}

在servlet中

MyClass obj1 = new MyClass(1L, "prop1");
MyClass obj2 = new MyClass(1L, "prop2");
request.getSession().removeAttribute("key");
request.getSession().setAttribute("key", obj1);
request.getSession().setAttribute("key", obj2);

两个id相同的对象。在WL12c中,会话仍将包含obj1。

如果我更改代码(obj1.id=2)

MyClass obj1 = new MyClass(1L, "prop1");
MyClass obj2 = new MyClass(2L, "prop2");
request.getSession().removeAttribute("key");
request.getSession().setAttribute("key", obj1);
request.getSession().setAttribute("key", obj2);

会话将包含obj2。

我们在WebLogic 10.3.5中没有这种行为,它具有相同的文档。那么,WL12c是否不符合Java EE 7 API?如果不是,为什么?

雷姆:扩展来说,我认为请求和应用程序属性是一样的。

编辑1:我在Tomcat 9和Wildfly 11中测试了这个简单的webapp(同样的战争)。WebLogic 12.2.1是唯一一个在会话中不替换对象的。

编辑2:我在最初的帖子中没有指出这一点,但我只找到了一个关于这个问题的主题,它被关闭了,没有任何相关的答案:HttpSession setAttribute并不总是插入新对象

共有1个答案

邹野
2023-03-14

Weblogic 12c中的会话管理有许多更新。访问您的Weblogic管理页面以查看您的会话是如何管理的。基于JDBC的会话持久性可能是威胁。

 类似资料:
  • 问题内容: 我听过关于此主题的不同回答,那么销毁PHP会话的肯定方法是什么? 在最简单的情况下,这是否足以真正终止用户与服务器之间的会话? 问题答案: 要销毁会话,您应该采取以下步骤: 删除会话数据 使会话ID无效 为此,我将使用以下代码: 为了确保会话ID无效,您应该只允许脚本启动的会话ID。因此,设置一个标志并检查它是否被设置: 此外,您可以使用此时间戳定期交换会话ID,以缩短其寿命:

  • 我正在从WLS10g和JavaEE6升级到WLS12c和JavaEE7。 我注意到的工作方式不同。在WLS10中,任何已经存储在某个键下的对象都将始终被替换。 在WLS12中,如果新建对象,则不会替换该对象。等于(旧对象)。 这对我们来说是个问题,因为应用程序有如下对象: ValueObject通过跨多个网页的工作流进行修改。中间值存储在中,并在工作流结束时将修改后的值写入数据库。 在servle

  • 我ogin.php 指数php 我做了一个登录脚本,打开,如果密码是正确的,我ndex.php网站。当第一次通过登录脚本打开ndex.php网站时,一切正常,会话设置完毕。但是在我刷新页面后,会话会被破坏,并且没有设置。那么我如何保存会话,这样它就不会因为刷新浏览器而被破坏呢?

  • 有人知道如何在Redis的Spring会话中添加会话破坏事件吗?我读到正常的方法是不可能的。我愿意这样做,因为我需要在一个会话被破坏(超时或注销)后做一些清理过程。我真的很感激你们的帮助,谢谢你们。

  • 我正在尝试使用youtube频道成员资格API(promoters . list)对结果列表进行分页,但是分页和PageTokens似乎无法正常工作。 我目前正在为用户开发一个应用程序,以生成他们频道的所有成员列表(使用apisponsors.list:https://developers.google.com/youtube/v3/live/docs/sponsors/list) 我有一个测试帐

  • 我已经编辑了php配置以保存Redis上的会话。一切正常,但我意识到,有一天已经过去了,通过在redis-cli上运行命令键*,显示了一个巨大的php-session条目列表。我的问题是php是否会在任何时候删除这些键,或者我必须做一些事情来防止这种情况发生。我对此很担心。