Add Session.changeSessionId

This commit is contained in:
Rob Winch
2017-07-20 15:03:18 -05:00
parent 2aa71ffb6d
commit be2604ca69
29 changed files with 576 additions and 169 deletions

View File

@@ -455,6 +455,88 @@ public class RedisOperationsSessionRepositoryITests extends AbstractITests {
assertThat(findByPrincipalName.keySet()).containsOnly(toSave.getId());
}
@Test
public void changeSessionIdWhenOnlyChangeId() throws Exception {
String attrName = "changeSessionId";
String attrValue = "changeSessionId-value";
RedisSession toSave = this.repository.createSession();
toSave.setAttribute(attrName, attrValue);
this.repository.save(toSave);
RedisSession findById = this.repository.findById(toSave.getId());
assertThat(findById.<String>getAttribute(attrName)).isEqualTo(attrValue);
String originalFindById = findById.getId();
String changeSessionId = findById.changeSessionId();
this.repository.save(findById);
assertThat(this.repository.findById(originalFindById)).isNull();
RedisSession findByChangeSessionId = this.repository.findById(changeSessionId);
assertThat(findByChangeSessionId.<String>getAttribute(attrName)).isEqualTo(attrValue);
}
@Test
public void changeSessionIdWhenChangeTwice() throws Exception {
RedisSession toSave = this.repository.createSession();
this.repository.save(toSave);
String originalId = toSave.getId();
String changeId1 = toSave.changeSessionId();
String changeId2 = toSave.changeSessionId();
this.repository.save(toSave);
assertThat(this.repository.findById(originalId)).isNull();
assertThat(this.repository.findById(changeId1)).isNull();
assertThat(this.repository.findById(changeId2)).isNotNull();
}
@Test
public void changeSessionIdWhenSetAttributeOnChangedSession() throws Exception {
String attrName = "changeSessionId";
String attrValue = "changeSessionId-value";
RedisSession toSave = this.repository.createSession();
this.repository.save(toSave);
RedisSession findById = this.repository.findById(toSave.getId());
findById.setAttribute(attrName, attrValue);
String originalFindById = findById.getId();
String changeSessionId = findById.changeSessionId();
this.repository.save(findById);
assertThat(this.repository.findById(originalFindById)).isNull();
RedisSession findByChangeSessionId = this.repository.findById(changeSessionId);
assertThat(findByChangeSessionId.<String>getAttribute(attrName)).isEqualTo(attrValue);
}
@Test
public void changeSessionIdWhenHasNotSaved() throws Exception {
String attrName = "changeSessionId";
String attrValue = "changeSessionId-value";
RedisSession toSave = this.repository.createSession();
String originalId = toSave.getId();
toSave.changeSessionId();
this.repository.save(toSave);
assertThat(this.repository.findById(toSave.getId())).isNotNull();
assertThat(this.repository.findById(originalId)).isNull();
}
private String getSecurityName() {
return this.context.getAuthentication().getName();
}

View File

@@ -675,6 +675,7 @@ public class RedisOperationsSessionRepository implements
private Map<String, Object> delta = new HashMap<>();
private boolean isNew;
private String originalPrincipalName;
private String originalSessionId;
/**
* Creates a new instance ensuring to mark all of the new attributes to be
@@ -699,6 +700,7 @@ public class RedisOperationsSessionRepository implements
Assert.notNull(cached, "MapSession cannot be null");
this.cached = cached;
this.originalPrincipalName = PRINCIPAL_NAME_RESOLVER.resolvePrincipal(this);
this.originalSessionId = cached.getId();
}
public void setNew(boolean isNew) {
@@ -726,6 +728,10 @@ public class RedisOperationsSessionRepository implements
return this.cached.getId();
}
public String changeSessionId() {
return this.cached.changeSessionId();
}
public Instant getLastAccessedTime() {
return this.cached.getLastAccessedTime();
}
@@ -773,10 +779,11 @@ public class RedisOperationsSessionRepository implements
* session.
*/
private void saveDelta() {
String sessionId = getId();
saveChangeSessionId(sessionId);
if (this.delta.isEmpty()) {
return;
}
String sessionId = getId();
getSessionBoundHashOperations(sessionId).putAll(this.delta);
String principalSessionKey = getSessionAttrNameKey(
FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME);
@@ -806,6 +813,15 @@ public class RedisOperationsSessionRepository implements
RedisOperationsSessionRepository.this.expirationPolicy
.onExpirationUpdated(originalExpiration, this);
}
private void saveChangeSessionId(String sessionId) {
if (!isNew() && !sessionId.equals(this.originalSessionId)) {
String originalSessionIdKey = getSessionKey(this.originalSessionId);
String sessionIdKey = getSessionKey(sessionId);
RedisOperationsSessionRepository.this.sessionRedisOperations.rename(originalSessionIdKey, sessionIdKey);
this.originalSessionId = sessionId;
}
}
}
/**

View File

@@ -131,6 +131,16 @@ public class RedisOperationsSessionRepositoryTests {
this.redisRepository.save(session);
}
@Test
public void changeSessionId() {
RedisSession createSession = this.redisRepository.createSession();
String originalId = createSession.getId();
String changeSessionId = createSession.changeSessionId();
assertThat(originalId).isNotEqualTo(changeSessionId);
assertThat(createSession.getId()).isEqualTo(createSession.getId());
}
@Test
public void createSessionDefaultMaxInactiveInterval() throws Exception {
Session session = this.redisRepository.createSession();