Предположим, у меня есть хранилище сеансов авторизации, реализованное как Cache<String, Session>
, где Cache
- это кеш Guava или что-то подобное, а Session
- это какой-то картоподобный объект с данными сеанса. Предположим, что ключи - это строки sessionId
, сгенерированные во время первоначальной аутентификации. Сам кэш имеет некоторую стратегию истечения срока действия, так что, например, после 30 м неактивности сеанс исключается и выполняется обратный вызов с двумя аргументами, ключ кеша и значение кеша которого равны , в конечном итоге , которое требует полной очистки.
Предположим, теперь я хочу сопоставить различные параметры входа одного и того же пользователя с одним и тем же sessionId
. Например, последующий запрос может быть сделан с теми же учетными данными, которые должны быть разрешены для уже существующего сеанса, или может быть размещен запрос API, связанный с тем же пользователем, или браузер может запросить данные, используя идентификатор сеанса в своем cookie - все они должны разрешаться в один и тот же сеанс и идентификатор сеанса.
Одной из стратегий для реализации этого было бы сохранение Map<String, String>
от исходного заголовка authorization
(или некоторого его хеша) до sessionId
и затем переход к исходному кешу. Это может быть простая карта, для которой пропущенное значение будет идентично ситуации, в которой есть значение, но нет соответствующего сеанса в кеше сеанса. Я мог бы в конечном итоге очистить все записи, совпадающие с идентификатором sessionId, когда вызывается обратный вызов истечения срока действия кэша сеанса. Это решение легко реализовать, но оно немного уродливо.
Другой стратегией, гораздо более привлекательной для , было бы использование оригинального заголовка authorization
(или некоторого его хеша) вместе с sessionId
в качестве ключа для указания кэша сеанса. к одному и тому же сеансу (поэтому несколько ключей, по крайней мере, два, указывают на одно и то же значение сеанса) Добавление данных является тривиальным, но удаление является сложным, поскольку все пары ключ-значение для одного и того же сеанса (значения) должны быть исключены одновременно, а обратный вызов должен быть вызван только один раз (так как некоторая логика завершения должна выполняться для сеанс, но только один раз).
Любое предложение для существующих библиотек кэширования, поддерживающих такую функциональность, или любые идеи, как реализовать идею, например, наверху. Guava Cache или любое другое решение для кэширования?