在Websocket上使用Stomp时,正确的授权,注销和重定向

时间:2019-03-19 13:52:04

标签: javascript websocket authorization logout stomp

很抱歉,如果我的问题在该论坛上重复了其他一些可用的问题,并且将您重定向到正确的链接,我将不胜感激。

我编写Spring MVC应用程序,并且在前端,我使用基于Websocket的Stomp协议(SockJS)具有动态更新页面的功能。 我使用Spring安全性来使用户具有授权能力。

当我在浏览器中有一个页面时,一切正常-我尝试进入我的页面,服务器将我重定向到登录页面,输入登录名和密码, 按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();
        } 
    });
});

0 个答案:

没有答案