2011-07-28 4 views
4

엔터프라이즈 수준의 Java 백엔드 애플리케이션으로 작업 중이며 토큰 기반 사용자 인증을 구축해야합니다. 프런트 엔드는 PHP를 사용하고 SOAP를 통해 Java 백엔드와 통신합니다.Guava의 HashBiMap을 축출과 함께 사용할 수 있습니까?

Guava의 HashBiMap을 사용하여 문제를 해결하는 방법에 대해 생각했습니다. 내가 UUID 토큰을 키로 생성하고 사용자 객체를 정적 HashBiMap의 값으로 저장할 수 있기 때문에 유용 할 것입니다. 사용자가 처음 성공적으로 로그인하면 사용자가 HashBiMap에 추가되고 로그인 응답은 생성 된 UUID 토큰을 반환합니다. 동일한 사용자에 대한 후속 SOAP 요청은 토큰만을 사용하여 작성됩니다.

내가 직면 한 문제는 30 분 동안 사용하지 않으면 토큰을 퇴거시킬 수있는 일종의 퇴거 논리가 필요하다는 것입니다. 제 연구에서 HashBiMap은 Guava의 MapMaker처럼 퇴거를 기본적으로 지원하지 않습니다.

아무에게도 HashBiMap을 사용하고 비활성 상태에서 퇴거를 지원하는 방법에 대한 권장 사항이 있습니까? 이 방법이 이상적이지 않으면 다른 전략에 개방적입니다.

업데이트 : 내가지도에 사용자 개체를 조회하고 사용자가지도하면 계속 자신의 기존 토큰을 얻을 수 있기를 원하기 때문에 HashBiMap를 사용할 필요가 있다고 생각

. 예를 들어 사용자가 30 분 내에 브라우저를 닫고 몇 분 후에 다시 돌아와 다시 로그인하면 사용자가 이미지도에 있는지 확인하여 기존 토큰을 반환 할 수 있는지 확인해야합니다. 기술적으로 여전히 유효 함).

+0

당신이 설명하지 않은 한 가지 이유는'UUID' 매핑에 반대'User'가 필요한 이유입니다.'User'매핑에 대한 'UUID'만으로 설명했던 것만으로도 충분할 것 같습니다. – ColinD

+0

@ColinD 귀하의 의견을 보내 주셔서 감사합니다! 위의 내 질문에 대한 업데이트를 참조하십시오. –

답변

3

가장 간단한 대답은 아니요, 자동 퇴거로 HashBiMap을 가질 수 없다는 것입니다. MapMaker이 만드는 맵은 특수화 된 동시 맵입니다. HashBiMap은 기본적으로 두 개의 래퍼 인 HashMap입니다.

하나의 옵션은 퇴거와 MapMaker -created지도에서 UUIDUser에 매핑을 저장하고 약한 키가 다른 MapMaker -created지도에 UserUUID에 매핑을 저장하기 위해 수 있습니다. 퇴거가있는지도의 항목이 퇴장 한 경우 UUID에 대한 참조가 없으면 UUID 약한 참조가 지워져 곧 역지도의 항목이 무효화되어야합니다. 사용자가 다시 로그인 할 때 해당 매핑이 계속 남아 있더라도 퇴거 명령을 사용하여지도에서 UUID을 찾아보고 항목을 발견하지 못하면 새로운 UUID을 생성하고 새 매핑을 만들어야합니다.

물론이 모든 작업을 수행 할 때 잠재적 인 동시성 문제를 고려해야합니다.

+0

두 번째지도에서 사용자가 약한 참조를 의미하지 않았습니까? –

+0

@Kublai Khan : 두 번째 맵에서'User' 또는'UUID'에 대한 약한 참조가 아마도 효과가있을 것입니다. – ColinD

+0

@ ColinD 답변을 주셔서 감사합니다. –

2

@ ColinD의 답을 echo하려면, HashBiMap은 게으른지도 래퍼가 아닙니다. 따라서 에 반영된 MapMaker지도의 변경 사항은 자동으로 표시되지 않습니다.

모든 것이 손실되지는 않습니다. @ ColinD는 두 개의 맵을 사용하여 제안했습니다. 이 단계를 더 진행하려면 소스 맵을 복사하는 대신보기 기반 인 사용자 정의 BiMap 구현 (HashBiMap처럼)에서이 두 맵을 래핑하지 마십시오. 그러면 사용자 정의 기능이있는 BiMap의 풍부한 API가 제공됩니다.

+0

추가 제안 해 주셔서 감사합니다. 나는 그것을 시도 할 것이다. –