Объект ссылается на другой адрес памяти после добавления функции совместного использования redis-сессии - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь добавить spring-session с redis с использованием xml к существующему проекту spring 3.

Однако я обнаружил, что объект сеанса, который получается с помощью user = (User)session.getAttribute(USER_ID);, становится другим объектом после добавления весенней сессии с помощью redis.

Я имею в виду, прежде чем я добавлю функцию весенней сессии redis, журнал отладки будет:

[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 голосов
/ 27 февраля 2019

Исходный проект 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);
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...