对象是指在spring中添加redis-session-sharing功能后的不同内存地址

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象是指在spring中添加redis-session-sharing功能后的不同内存地址相关的知识,希望对你有一定的参考价值。

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

但是,我发现使用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>

User.java

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

什么可能导致这个问题?

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

对不起,我还没有找到一种方法来创建一个简单的环境来重现这种现象。

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

答案

最初的spring 3项目在初始化之后没有将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);添加到上面的代码后。该错误不再发生。

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);
  ...

以上是关于对象是指在spring中添加redis-session-sharing功能后的不同内存地址的主要内容,如果未能解决你的问题,请参考以下文章

Spring中常见的设计模式——装饰者模式

Spring学习第0节 -- 核心技术Ioc容器IOC理解

Spring Bean

Spring注入

Spring,SpringMVC,SpringBoot区别及联系

深拷贝和浅拷贝