Мне жаль, если мой вопрос повторил некоторые другие доступные вопросы на этом форуме, и я буду благодарен, если вы перенаправите меня на соответствующие ссылки.
Я пишу приложение Spring MVC и на стороне пользователя использую протокол Stomp over websocket (SockJS), чтобы динамически обновлять страницу.
Я использую Spring security, чтобы пользователи имели возможность авторизации.
Когда у меня есть одна страница в браузере, все работает нормально - я пытаюсь зайти на свою страницу, сервер перенаправляет меня на страницу входа, я ввожу логин и пароль,
нажмите Enter и сервер перенаправит меня на нужную страницу.
После этого я могу нажимать кнопки на странице, они запускают функции javascript, которые подключаются к серверу, отправляют запросы JSON, получают ответы и
обновить пользовательский интерфейс в соответствии с полученной информацией.
Но я пробую другую ситуацию:
- дважды открыть страницу в отдельных окнах,
- Я авторизуюсь в одном из них, обновляю другой, и в результате у меня есть доступ к главной странице сервера в двух окнах,
- Я нажимаю ссылку Выход из системы на первой странице и возвращаюсь обратно на страницу входа,
- но в другом окне у меня есть главная страница, которая все еще открыта,
- когда я нажимаю кнопку для отправки запроса, javascript-код пытается подключиться к серверу, но сервер возвращает статус 302 и перенаправляет меня на страницу входа,
- это причина ошибок в консоли javascript, и моя страница начинает пытаться соединиться с сервером, сервер перенаправляет его ... и так далее в цикле.
Не могли бы вы объяснить, как правильно обрабатывать событие выхода из системы, чтобы избежать подобных ситуаций (я говорю о двух открытых окнах).
Я думаю об использовании файлов cookie, где я могу хранить информацию о своей авторизации и на всех страницах, прежде чем делать запрос к серверу, я должен проверить этот файл cookie, если файл cookie авторизации отсутствует, и я автоматически перенаправляю на страницу входа.
Но, возможно, существует другой способ для страниц понять, что им нужно выйти из системы.
var stompClient = null;
var sock = null;
var MessageTypeEnum = {"NONE":0, "CARD_REQUEST":1};
var StateEnum = {"ST_INIT":0,
"ST_CARD_REQ_SENT":1,
"ST_CARD_REQ_OK":2,
"ST_ERROR":3};
var state = StateEnum.ST_INIT;
function cardProcess(messageType) {
sock = new SockJS('/page-websocket');
stompClient = Stomp.over(sock);
stompClient.connect({}, function (frame) {
stompClient.subscribe('/topic/card', function (response) {
if(messageType === MessageTypeEnum.CARD_REQUEST) {
var errors = JSON.parse(response.body).errors;
if(errors === 'none') {
state = StateEnum.ST_CARD_REQ_OK;
} else {
state = StateEnum.ST_ERROR;
}
responseWaitingStop();
cardDisconnect();
};
});
if(messageType === MessageTypeEnum.CARD_REQUEST) {
stompClient.send("/app/card", {}, JSON.stringify({
'packetType': 'CardRequest',
'cardNumber': $("#cardNumberInp").val()}));
state = StateEnum.ST_CARD_REQ_SENT;
};
}, function(error) {
console.log('StompClient: ' + error);
});
}
function cardDisconnect() {
if (stompClient !== null) {
if(stompClient)
stompClient.disconnect(function() {
sock.close();
});
}
console.log("Server disconnected");
}
function cardRequest() {
cardProcess(MessageTypeEnum.CARD_REQUEST);
responseWaitStart(SERVER_QUERY_TIME);
}
$(document).ready(function () {
state = StateEnum.ST_INIT;
$( "#cardRequestButton" ).click(function() {
if(checkLogged() === true) {
cardRequest();
}
});
});