我正在尝试将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
的数据。
对不起,我还没有找到一种方法来创建一个最小的环境来重现这种现象。
如果您需要有关该项目的其他信息,请告诉我。我会将这些信息粘贴到问题中。
答案 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);
...