Сброс бина области видимости сеанса Spring между запросами при доступе через zuul
Приложение Spring имеет сессионный компонент, который содержит определенные данные. Эти данные загружаются из БД в init
запрос к контроллеру, который всегда является первым запросом клиента при запуске. Эти данные используются для других запросов тем же пользователем. Теперь все работает само по себе. Однако после попытки интегрировать приложение в систему с помощью zuul (который, насколько я понимаю, в этом контексте просто перенаправляет запрос с одного URL-адреса на другой), он сломался. Всякий раз, когда метод вызывается после init
данные сессионного компонента null
,
Вот фрагмент из класса обслуживания:
@Autowired
TaskCache cache;
@Override
public void initUserSession() {
List<Task> data = loadTasks();
cache.setTasks(data);
LinearFilterStack<Task> fs = createFilterStack(data);
cache.setFilterStack(fs);
System.out.println(cache.hashCode()); //hashcode stays same
System.out.println(cache.getFilterStack() == null) //false
}
@Override
public List<Task> getTasks(Sort sort) {
System.out.println(cache.hashCode()); //hashcode stays same
System.out.println(cache.getFilterStack() == null) //true
LinearFilterStack<Task> fs = cache.getFilterStack();
List<Task> tasks = fs.filter(cache.getTasks()); //Obviously NPE
sortTasks(tasks, sort);
return tasks;
}
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class TaskCache { ... }
И опять же, это происходит только через зуул. Т.е. если я использую localhost:30022/rest/... это работает, если я использую localhost:8080/app/tasks/rest/... (который zuul перенаправляет на localhost:30022/rest/...), я получаю NPE потому что компонент кэша теряет свои данные после запроса инициализации.
1 ответ
Это может быть вызвано поведением Zuul по умолчанию, которое предотвращает передачу заголовков, связанных с cookie.
Ниже приведена конфигурация Zuul по умолчанию, и она не позволяет передавать заголовки ниже на ваши нижестоящие серверы API.
zuul.sensitiveHeaders= Authorization,Cookie,Set-Cookie
Поэтому, пожалуйста, попробуйте определить ниже свойства. Это позволит передавать все заголовки, связанные с файлами cookie, на серверы API.
zuul.sensitiveHeaders= Authorization
Вы можете найти более подробную информацию в разделе "Файлы cookie и чувствительные заголовки" этого документа.