Правильная авторизация, выход из системы и перенаправление при использовании Stomp через Websocket - PullRequest
0 голосов
/ 19 марта 2019

Мне жаль, если мой вопрос повторил некоторые другие доступные вопросы на этом форуме, и я буду благодарен, если вы перенаправите меня на соответствующие ссылки.

Я пишу приложение 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();
        } 
    });
});
...