Из источника
HttpSession session = req.getSession(false); // line 196
req
является локальным, поэтому потокобезопасным, и если параллельные запросы получены, где вышеупомянутый session
(уникальный для каждого потока) приводит кв null
тогда вполне разумно предположить, что параллельные запросы представляют разных пользователей (или, по крайней мере, несвязанные запросы от одного пользователя).
Позже устанавливается новый сеанс (уникальный для каждого потока):
session = req.getSession(true); // line 217
На этом этапе другой параллельный запрос не может быть связан с вышеуказанным ненулевым session
, поскольку клиент еще не получил ответ, поэтому клиент еще не знает свой сеансИдентификатор для отправки во время последующего запроса.
Таким образом, можно безопасно создать атрибут сеанса для только что созданного сеанса:
session.setAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME, nonceCache); // line 219
Затем ответ отправляется обратно клиенту с идентификатором сеанса.,Следующий запрос включает идентификатор сеанса, поэтому
session = req.getSession(true); // line 217
не будет нулевым.И точно так же, nonceCache
не будет нулевым, поэтому весь этот блок
if (nonceCache == null) {
nonceCache = new LruCache<String>(nonceCacheSize);
if (session == null) {
session = req.getSession(true);
}
session.setAttribute(
Constants.CSRF_NONCE_SESSION_ATTR_NAME, nonceCache);
}
будет пропущен во время последующих запросов, связанных с существующим сеансом.
Доступ к элементам кэша синхронизированво вложенных LruCache
строках классов 358 и 364.