97
97
* <pre class="code">
98
98
* CREATE TABLE SPRING_SESSION (
99
99
* PRIMARY_ID CHAR(36) NOT NULL,
100
- * SESSION_ID CHAR(36),
100
+ * SESSION_ID CHAR(36) NOT NULL ,
101
101
* CREATION_TIME BIGINT NOT NULL,
102
102
* LAST_ACCESS_TIME BIGINT NOT NULL,
103
103
* MAX_INACTIVE_INTERVAL INT NOT NULL,
104
+ * EXPIRY_TIME BIGINT NOT NULL,
104
105
* PRINCIPAL_NAME VARCHAR(100),
105
106
* CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
106
107
* );
107
108
*
108
- * CREATE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (LAST_ACCESS_TIME);
109
+ * CREATE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
110
+ * CREATE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (EXPIRY_TIME);
109
111
*
110
112
* CREATE TABLE SPRING_SESSION_ATTRIBUTES (
111
113
* SESSION_PRIMARY_ID CHAR(36) NOT NULL,
112
- * ATTRIBUTE_NAME VARCHAR(200),
113
- * ATTRIBUTE_BYTES BYTEA,
114
+ * ATTRIBUTE_NAME VARCHAR(200) NOT NULL ,
115
+ * ATTRIBUTE_BYTES BYTEA NOT NULL ,
114
116
* CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
115
117
* CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
116
118
* );
@@ -138,8 +140,8 @@ public class JdbcOperationsSessionRepository implements
138
140
private static final String SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT" ;
139
141
140
142
private static final String CREATE_SESSION_QUERY =
141
- "INSERT INTO %TABLE_NAME%(PRIMARY_ID, SESSION_ID, CREATION_TIME, LAST_ACCESS_TIME, MAX_INACTIVE_INTERVAL, PRINCIPAL_NAME) " +
142
- "VALUES (?, ?, ?, ?, ?, ?)" ;
143
+ "INSERT INTO %TABLE_NAME%(PRIMARY_ID, SESSION_ID, CREATION_TIME, LAST_ACCESS_TIME, MAX_INACTIVE_INTERVAL, EXPIRY_TIME, PRINCIPAL_NAME) " +
144
+ "VALUES (?, ?, ?, ?, ?, ?, ? )" ;
143
145
144
146
private static final String CREATE_SESSION_ATTRIBUTE_QUERY =
145
147
"INSERT INTO %TABLE_NAME%_ATTRIBUTES(SESSION_PRIMARY_ID, ATTRIBUTE_NAME, ATTRIBUTE_BYTES) " +
@@ -152,7 +154,7 @@ public class JdbcOperationsSessionRepository implements
152
154
"WHERE S.SESSION_ID = ?" ;
153
155
154
156
private static final String UPDATE_SESSION_QUERY =
155
- "UPDATE %TABLE_NAME% SET SESSION_ID = ?, LAST_ACCESS_TIME = ?, MAX_INACTIVE_INTERVAL = ?, PRINCIPAL_NAME = ? " +
157
+ "UPDATE %TABLE_NAME% SET SESSION_ID = ?, LAST_ACCESS_TIME = ?, MAX_INACTIVE_INTERVAL = ?, EXPIRY_TIME = ?, PRINCIPAL_NAME = ? " +
156
158
"WHERE PRIMARY_ID = ?" ;
157
159
158
160
private static final String UPDATE_SESSION_ATTRIBUTE_QUERY =
@@ -175,9 +177,9 @@ public class JdbcOperationsSessionRepository implements
175
177
"LEFT OUTER JOIN %TABLE_NAME%_ATTRIBUTES SA ON S.PRIMARY_ID = SA.SESSION_PRIMARY_ID " +
176
178
"WHERE S.PRINCIPAL_NAME = ?" ;
177
179
178
- private static final String DELETE_SESSIONS_BY_LAST_ACCESS_TIME_QUERY =
180
+ private static final String DELETE_SESSIONS_BY_EXPIRY_TIME_QUERY =
179
181
"DELETE FROM %TABLE_NAME% " +
180
- "WHERE MAX_INACTIVE_INTERVAL < (? - LAST_ACCESS_TIME) / 1000 " ;
182
+ "WHERE EXPIRY_TIME < ? " ;
181
183
182
184
private static final Log logger = LogFactory
183
185
.getLog (JdbcOperationsSessionRepository .class );
@@ -211,7 +213,7 @@ public class JdbcOperationsSessionRepository implements
211
213
212
214
private String listSessionsByPrincipalNameQuery ;
213
215
214
- private String deleteSessionsByLastAccessTimeQuery ;
216
+ private String deleteSessionsByExpiryTimeQuery ;
215
217
216
218
/**
217
219
* If non-null, this value is used to override the default value for
@@ -333,11 +335,11 @@ public void setListSessionsByPrincipalNameQuery(String listSessionsByPrincipalNa
333
335
334
336
/**
335
337
* Set the custom SQL query used to delete the sessions by last access time.
336
- * @param deleteSessionsByLastAccessTimeQuery the SQL query string
338
+ * @param deleteSessionsByExpiryTimeQuery the SQL query string
337
339
*/
338
- public void setDeleteSessionsByLastAccessTimeQuery (String deleteSessionsByLastAccessTimeQuery ) {
339
- Assert .hasText (deleteSessionsByLastAccessTimeQuery , "Query must not be empty" );
340
- this .deleteSessionsByLastAccessTimeQuery = deleteSessionsByLastAccessTimeQuery ;
340
+ public void setDeleteSessionsByExpiryTimeQuery (String deleteSessionsByExpiryTimeQuery ) {
341
+ Assert .hasText (deleteSessionsByExpiryTimeQuery , "Query must not be empty" );
342
+ this .deleteSessionsByExpiryTimeQuery = deleteSessionsByExpiryTimeQuery ;
341
343
}
342
344
343
345
/**
@@ -385,7 +387,8 @@ protected void doInTransactionWithoutResult(TransactionStatus status) {
385
387
ps .setLong (3 , session .getCreationTime ().toEpochMilli ());
386
388
ps .setLong (4 , session .getLastAccessedTime ().toEpochMilli ());
387
389
ps .setInt (5 , (int ) session .getMaxInactiveInterval ().getSeconds ());
388
- ps .setString (6 , session .getPrincipalName ());
390
+ ps .setLong (6 , session .getExpiryTime ().toEpochMilli ());
391
+ ps .setString (7 , session .getPrincipalName ());
389
392
});
390
393
if (!session .getAttributeNames ().isEmpty ()) {
391
394
final List <String > attributeNames = new ArrayList <>(session .getAttributeNames ());
@@ -421,8 +424,9 @@ protected void doInTransactionWithoutResult(TransactionStatus status) {
421
424
ps .setString (1 , session .getId ());
422
425
ps .setLong (2 , session .getLastAccessedTime ().toEpochMilli ());
423
426
ps .setInt (3 , (int ) session .getMaxInactiveInterval ().getSeconds ());
424
- ps .setString (4 , session .getPrincipalName ());
425
- ps .setString (5 , session .primaryKey );
427
+ ps .setLong (4 , session .getExpiryTime ().toEpochMilli ());
428
+ ps .setString (5 , session .getPrincipalName ());
429
+ ps .setString (6 , session .primaryKey );
426
430
});
427
431
}
428
432
Map <String , Object > delta = session .getDelta ();
@@ -524,7 +528,7 @@ public Map<String, JdbcSession> findByIndexNameAndIndexValue(String indexName,
524
528
public void cleanUpExpiredSessions () {
525
529
int deletedCount = this .transactionOperations .execute (transactionStatus ->
526
530
JdbcOperationsSessionRepository .this .jdbcOperations .update (
527
- JdbcOperationsSessionRepository .this .deleteSessionsByLastAccessTimeQuery ,
531
+ JdbcOperationsSessionRepository .this .deleteSessionsByExpiryTimeQuery ,
528
532
System .currentTimeMillis ()));
529
533
530
534
if (logger .isDebugEnabled ()) {
@@ -571,8 +575,8 @@ private void prepareQueries() {
571
575
this .deleteSessionQuery = getQuery (DELETE_SESSION_QUERY );
572
576
this .listSessionsByPrincipalNameQuery =
573
577
getQuery (LIST_SESSIONS_BY_PRINCIPAL_NAME_QUERY );
574
- this .deleteSessionsByLastAccessTimeQuery =
575
- getQuery (DELETE_SESSIONS_BY_LAST_ACCESS_TIME_QUERY );
578
+ this .deleteSessionsByExpiryTimeQuery =
579
+ getQuery (DELETE_SESSIONS_BY_EXPIRY_TIME_QUERY );
576
580
}
577
581
578
582
private void serialize (PreparedStatement ps , int paramIndex , Object attributeValue )
@@ -643,6 +647,10 @@ String getPrincipalName() {
643
647
return PRINCIPAL_NAME_RESOLVER .resolvePrincipal (this );
644
648
}
645
649
650
+ Instant getExpiryTime () {
651
+ return getLastAccessedTime ().plus (getMaxInactiveInterval ());
652
+ }
653
+
646
654
public String getId () {
647
655
return this .delegate .getId ();
648
656
}
0 commit comments