Эта задача была помечена как содержащая конфиденциальную информацию, такую как уязвимости кода и утечки конфиденциальных данных, и доступна для просмотра только участниками репозитория
[ОШИБКА] Использование одного sessionId в нескольких потоках для входа может привести к потере данных входа.
Я прошел следующие шаги для тестирования:
Тестирование одновременного входа с одним sessionId при использовании нескольких потоков
Получены следующие результаты:
При входе происходит серьезное отсутствие свойства terminalList объекта SaSession, 100% воспроизводимость
В частности, строка кода номер xx не соответствует описанию в документации:
Строка 1343 класса StpLogic
Мое понимание:
Проверка условия if(session == null && isCreate) имеет проблемы, так как при одновременном входе нескольких потоков (с одним sessionId) это условие всегда истинно, что приводит к созданию нескольких объектов SaSession. В результате только некоторые токены становятся действительными, а длина terminalList также неверна (при 10 параллельных входах, длина terminalList обычно составляет 1, а не 10). Я попытался добавить ключевое слово synchronized в метод getSessionBySessionId, что позволило корректно заполнять terminalList, но значение historyTerminalCount все еще неверное, так как тип int не может обрабатывать конкуренцию. Поэтому добавление ключевого слова synchronized в метод login может временно решить эту проблему.