Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 奇怪的会话行为。。!!在运行时更改用户对象属性_Java_Jakarta Ee_Jboss7.x_Session State_Httpsession - Fatal编程技术网

Java 奇怪的会话行为。。!!在运行时更改用户对象属性

Java 奇怪的会话行为。。!!在运行时更改用户对象属性,java,jakarta-ee,jboss7.x,session-state,httpsession,Java,Jakarta Ee,Jboss7.x,Session State,Httpsession,在web应用程序中测试并发访问时,我们在跟踪会话行为方面遇到了一些困难 假设我们有三个不同的用户,A、B和C 我们使用三种不同的浏览器和这三个用户登录应用程序,然后在运行时,我的用户对象从B更改为A或B更改为C或C更改为A,但这是随机发生的 我的UserContextHolder类是: public final class UserObjContextHolder { private static final ThreadLocal<UserObj> CONTEXT_HOLD

在web应用程序中测试并发访问时,我们在跟踪会话行为方面遇到了一些困难

假设我们有三个不同的用户,A、B和C

我们使用三种不同的浏览器和这三个用户登录应用程序,然后在运行时,我的用户对象从B更改为A或B更改为C或C更改为A,但这是随机发生的

我的UserContextHolder类是:

public final class UserObjContextHolder {
    private static final ThreadLocal<UserObj> CONTEXT_HOLDER = new ThreadLocal<UserObj>();

    private UserObjContextHolder() {
    }

    public static void setUserObj(UserObj userObj) {
        CONTEXT_HOLDER.set(userObj);
    }

    public static UserObj getUserObj() {
        return CONTEXT_HOLDER.get();
    }

}
public final类UserObjContextHolder{
私有静态最终ThreadLocal上下文_HOLDER=new ThreadLocal();
私有用户objContextHolder(){
}
公共静态void setUserObj(UserObj UserObj){
CONTEXT_HOLDER.set(userObj);
}
公共静态UserObj getUserObj(){
返回上下文\u HOLDER.get();
}
}
我正在使用Hibernate进行ORM和SpringMVC

有人能告诉我这个会话行为的原因或者我如何同步它吗

我注意到一件事:如果用户A登录并执行一些搜索操作,如果用户B同时登录,则userObj A将更改为userObj B


它与应用服务器设置有关吗?只有在进行身份验证时才会发生这种情况。

我想了解有关如何执行搜索操作以及在ThreadLocal对象(上下文\u持有者)中设置UserObj的详细信息

我们必须记住,ThreadLocal是线程作用域,而不是会话作用域。这意味着ThreadLocal中的set对象是相同的当且仅当设置该对象的线程与请求该对象的线程相同时

我最初的理论是搜索操作是在同一个会话中执行的,但不是在同一个线程上执行的。下面是一个简单的场景:

  • UserA使用线程A登录。UserA使用线程A存储在上下文\u持有者中
  • UserB使用线程B登录。UserB使用线程B存储在上下文\u持有者中
  • UserC使用线程C登录。UserC使用线程C存储在上下文\u持有者中
  • 一段时间后,UserA执行搜索操作。服务器使用线程A执行操作(幸运的是)。ThreadLocal返回用户一个正确且预期的obj
  • 同样,过了一会儿,用户a执行搜索操作。这一次,(不幸的是)服务器使用线程C执行操作(哦!)ThreadLocal将返回UserC,因为线程C用于执行搜索操作。(另一方面,如果搜索操作中使用了线程B,则ThreadLocal将返回UserB)
假设服务器只使用三个线程,上述场景过于简化。但我希望它能解释如何获得不同的UserObj对象。 如果我上面描述的是您正在经历的情况,那么我认为您也会不时收到空值(遇到这种情况的频率取决于服务器使用的线程总数)。原因是ThreadLocal返回当前未设置的初始值(根据上面的代码,该值为null)

因此,解决问题的方法是确保在同一线程中执行以下操作:

  • 在ThreadLocal中设置UserObj
  • 执行搜索操作并在ThreadLocal中获取UserObj

如果您希望我能为您提供一个示例代码,请告诉我。

您如何使用UserObjContextHolder?我已经编写了UserObjContextHolder.setUserObj();在服务端和DAO,我使用用户UserObj UserObj=UserObjContextHolder.getUserObj()获取这个用户;my@DaveNewton:谢谢你的editThnaks。。。这就是我想知道的。。。。但是你能给我同样的代码样本吗。。。提前通知。。!!!