Spring Filter - жизненный цикл HttpSession с сеансом Bean Scoped - не сохранять свойства в сеансе - PullRequest
0 голосов
/ 01 октября 2019

У меня проблема с реализацией httpSession и spring redis. Я объявил фильтр, у которого есть одна работа. Поймайте параметр запроса и установите его в сессию. Этот атрибут используется позже для вызова внешнего API.

Моя реализация:

Я использую Spring-Boot

Я использую JedisConnectionFactory для сохранения моего сеанса в Reddis.

<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
  <exclusions>
    <exclusion>
      <groupId>io.lettuce</groupId>
      <artifactId>lettuce-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
</dependency>

объявить хранилище использованиявведите redis to spring-boot

session:
    store-type: redis
    timeout: 900s

  redis:
    host: redis
    port: 6379

теперь мой фильтр

@Component
@Slf4j
@Order(1)
public class MyCustomFilter implements Filter {

  @Resource
  private SessionHelper sessionHelper;

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) servletRequest;

    // retrieve site from request attribute
    final String site = request.getParameter("site");

    // persiste site into session with a bean scoped SESSION
    sessionHelper.saveSite(site);

    filterChain.doFilter(request, response);
  }

}

мой sessionHelper

@Component
@Slf4j
@Scope(value = SCOPE_SESSION, proxyMode = TARGET_CLASS)
public class SessionHelper implements Serializable {

  @Resource
  private HttpSession httpSession;

  public void saveSite(String site) {
    httpSession.setAttribute("site", site);
  }

  public String getSite(String site) {
    return (String) httpSession.getAttribute("site");
  }

}

мой сервис, которому нужно получить сайт из сеанса

@Slf4j
@Component
public class MyFacade {

  @Resource
  private SessionHelper sessionHelper;

  public void myMethod() {
    log.debug(sessionHelper.getSite());
  }

}

результат, мой журнал фасадов всегда нулевой. Так что я не понимаю почему. Мой фильтр установил эту переменную в сеанс.

Я попытался записать sessionId на тот момент, когда переменная установлена ​​и когда она получена. Идентификатор сессии отличается ... и я не понимаю, почему.

, если кто-то знает за меня ...

thx

...