Есть ли способ использовать HashBiMap Guava с выселением? - PullRequest
4 голосов
/ 28 июля 2011

Я работаю с Java-приложением корпоративного уровня, и мне нужно встроить аутентификацию пользователя на основе токенов. Внешний интерфейс использует PHP и взаимодействует с внутренним интерфейсом Java через SOAP.

Я думал об использовании HashBiMap от Guava, чтобы помочь мне с этой проблемой. Это было бы полезно для меня, потому что я мог генерировать токены UUID в качестве ключей и сохранять объекты User в качестве значений в статическом HashBiMap. Когда пользователь впервые успешно войдет в систему, он будет добавлен в HashBiMap, и в ответ на вход в систему будет возвращен сгенерированный токен UUID. Последующие запросы SOAP для того же пользователя будут выполняться только с использованием токена.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мне нужна какая-то логика выселения, которая позволила бы удалить эти токены после 30 минут бездействия. В моем исследовании выяснилось, что HashBiMap изначально не поддерживает выселение, как MapMaker в Guava.

У кого-нибудь есть какие-либо рекомендации о том, как я могу использовать HashBiMap и поддерживать выселение за неактивность? Если этот подход не идеален, я открыт для других стратегий.

Обновление:

Я думаю, что мне нужно использовать HashBiMap, потому что я хочу иметь возможность искать объект User на карте и получать его уже существующий токен, если пользователь все еще находится на карте. Например, если пользователь закрывает свой браузер в течение 30-минутного окна и через несколько минут возвращается и снова входит в систему, мне нужно проверить, существует ли пользователь на карте, чтобы я мог вернуть его существующий токен (так как он технически все еще в силе).

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

Самый простой ответ: нет, у вас не может быть HashBiMap с автоматическим выселением.Карты, которые MapMaker делает, являются специализированными параллельными картами.HashBiMap - это просто обертка вокруг двух HashMap с.

Один из вариантов - сохранить отображение UUID на User на карте, созданной MapMaker, с выселением и сохранить User to UUID отображение в другой MapMaker созданной карте, имеющей слабые ключи.Когда запись на карте с выселением выселяется, запись на обратной карте вскоре должна быть признана недействительной из-за очистки слабой ссылки UUID (при условии, что ссылки на UUID в другом месте не хранятся).Даже если это сопоставление все еще было, когда пользователь снова входит в систему, когда вы просматриваете UUID на карте с выселением и не обнаруживаете запись для него, вы знаете, что вам нужно сгенерировать новый UUID и создать новыйmappings.

Конечно, при выполнении всего этого вам, вероятно, необходимо учитывать любые потенциальные проблемы параллелизма.

2 голосов
/ 29 июля 2011

Повторяя ответ @ ColinD, HashBiMap - это не ленивая оболочка карты; таким образом, вы не будете автоматически видеть изменения с карты MapMaker, отраженные в BiMap.

Однако еще не все потеряно. @ColinD предложил использовать две карты. Чтобы продвинуться дальше, почему бы не обернуть эти две карты в пользовательскую реализацию BiMap, основанную на просмотре, а не копировать исходную карту (как это делает HashBiMap). Это даст вам выразительный API из BiMap с пользовательскими функциями, которые вам требуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...