Есть ли способ использовать HashBiMap Guava с выселением?

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

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

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

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

Обновление:

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


person Mark Bouchard    schedule 28.07.2011    source источник
comment
Одна вещь, которую вы не объяснили, это то, почему вам нужно обратное отображение User в UUID. Кажется, что для того, что вы описали, одного сопоставления UUID с User было бы достаточно.   -  person ColinD    schedule 28.07.2011
comment
@ColinD Спасибо за ваш комментарий! Пожалуйста, смотрите обновление к моему вопросу выше.   -  person Mark Bouchard    schedule 28.07.2011


Ответы (2)


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

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

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

person ColinD    schedule 28.07.2011
comment
Разве вы не имели в виду, что User будет слабой ссылкой на второй карте? - person Paul Bellora; 29.07.2011
comment
@Kublai Khan: Слабая ссылка на User или UUID на второй карте, вероятно, сработает. - person ColinD; 29.07.2011
comment
@ColinD Спасибо за ответ и за помощь! - person Mark Bouchard; 29.07.2011
comment
Не совсем так, как я не ищу выселение по времени, но я попросил разработчиков Guava предоставить BiMap, который поддерживает слабые/мягкие значения. github.com/google/guava/issues/2462 - person mrswadge; 19.04.2016

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

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

person Ray    schedule 28.07.2011
comment
Спасибо за дополнительное предложение! Я попробую. - person Mark Bouchard; 29.07.2011