gpt4 book ai didi

java - spring添加redis-session-sharing功能后对象引用不同的内存地址

转载 作者:可可西里 更新时间:2023-11-01 11:23:47 25 4
gpt4 key购买 nike

我正在尝试添加 spring-session with redis using xml到现有的 spring 3 项目。

但是,我发现 session 对象,这是通过使用user = (User)session.getAttribute(USER_ID);,加上redis的spring-session后变成不同的对象

我的意思是在我添加redis spring-session功能之前,调试日志是:

[DEBUG] user object when first created: com.company.User@63e02404
[DEBUG] user object before something goes wrong: com.company.User@63e02404

注意上面两个用户指的是同一个内存。这意味着它们属于同一个实例。

添加redis spring-session功能后调试日志变为:

[DEBUG] user object when first created: com.company.User@bf98354
[DEBUG] user object before something goes wrong: com.company.User@711d0e44

这两个用户对象不再引用同一个内存地址。这会给项目带来一些错误。例如,user.getName() 在添加 spring-session 后返回一个空字符串,""

spring-session相关的代码如下:

WEB-INF/web.xml:

<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/context.xml</param-value>
</context-param>

WEB-INF/context.xml:

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="127.0.0.1" />
<property name="port" value="6379" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>

<util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>

<!-- Session -->
<bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" >
<property name="maxInactiveIntervalInSeconds" value="120" />
</bean>

用户.java

public class User extends JdkSerializationRedisSerializer implements Serializable {
private static final long serialVersionUID = 1L;

什么可能导致这个问题?

我已经检查过 redis 包含用户的数据。

抱歉,我还没有想出一种方法来创建一个最小的环境来重现这种现象。

如果您需要有关该项目的任何其他信息,请告诉我。我会将这些信息粘贴到问题中。

最佳答案

原来的spring 3项目在初始化后并没有将user添加回session。

public String processManagement(ModelMap model, HttpServletRequest request, HttpServletResponse response) {
User user = (User)request.getSession().getAttribute(User.USER_ID);
managementService.initRequiredInfo(request, user);
...

在上面的代码中加入request.getSession().setAttribute(User.USER_SID, user);之后。该错误不再发生。

public String processManagement(ModelMap model, HttpServletRequest request, HttpServletResponse response) {
User user = (User)request.getSession().getAttribute(User.USER_ID);
managementService.initRequiredInfo(request, user);
request.getSession().setAttribute(User.USER_SID, user);
...

关于java - spring添加redis-session-sharing功能后对象引用不同的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54902987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com