在Spring中添加redis-session-sharing功能后,对象引用了不同的内存地址

时间:2019-02-27 10:12:17

标签: java spring session redis

我正在尝试将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的数据。

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

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

1 个答案:

答案 0 :(得分:0)

原始的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);
  ...