Доступ к атрибутам сеанса, установленным в HttpServlet в WebSocketServlet (Jetty WebSockets) - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь получить доступ к атрибутам сеанса, установленным в HttpServlet из WebSocketServlet

У меня есть два ServletContextHandler объекта, оба с включенным SESSIONS:

val httpHandler = object : ServletContextHandler(nullParent, contextPath, SESSIONS).apply {
    addServlet(ServletHolder(httpServlet), "/*")
}

val webSocketHandler = ServletContextHandler(nullParent, contextPath, SESSIONS).apply {
    addServlet(ServletHolder(wsServlet), "/*")
}

Они прикреплены как HandlerList(httpHandler, webSocketHandler) к моей пристани Server. Первая строка doHandle ServletContextHandler для HttpHandler проверяет, является ли запрос запросом на обновление WebSocket, и немедленно возвращает его, если он есть (в этом случае он передается ServletContextHandler для WebSocketServlet).

У меня есть простая конечная точка POST, которая устанавливает атрибут сеанса, но я не могу получить этот атрибут сеанса в WebSocketServlet:

class MyWsServlet : WebSocketServlet() {

    override fun configure(factory: WebSocketServletFactory) {
        factory.creator = WebSocketCreator { req, res ->
            // session exists here, but req.session.getAttribute("any-attr") is always null
        }
    }

    override fun service(req: HttpServletRequest, res: HttpServletResponse) {
        // session also exists here, but req.session.getAttribute("any-attr") is always null
    }

}

Любой совет или предложения приветствуются.

Редактировать: я включил некоторую отладочную информацию из запроса GET против запроса WebSocket после вызова req.session.setAttribute("test", "tast"):

Path: /
Cookies:{JSESSIONID=node01cxyhb0addjwikyb2lgtnlxlw0.node0}
Session: Session@24b04e4{id=node01cxyhb0addjwikyb2lgtnlxlw0,x=node01cxyhb0addjwikyb2lgtnlxlw0.node0,req=1,res=true}
Session id: node01cxyhb0addjwikyb2lgtnlxlw0
Session isNew: false
Session attributes: {test=tast}
---------------------------
Path: /websocket
Cookies:{JSESSIONID=node01cxyhb0addjwikyb2lgtnlxlw0.node0}
Session: Session@5989f3d1{id=node01cxyhb0addjwikyb2lgtnlxlw0,x=node01cxyhb0addjwikyb2lgtnlxlw0.node0,req=1,res=true}
Session id: node01cxyhb0addjwikyb2lgtnlxlw0
Session isNew: false
Session attributes: {}

1 Ответ

1 голос
/ 19 марта 2020

Во-первых, избавьтесь от своих 2 ServletContextHandler, используйте один. В любом случае у вас не может быть двух обработчиков для одного и того же contextPath.

Кроме того, у вас есть два основных способа реализации веб-сокетов Jetty Server, используя WebSocketServlet или WebSocketUpgradeFilter. Самым большим отличием является то, что при использовании WebSocketUpgradeFilter вы можете иметь несколько отображений, указывающих на любое количество конечных точек WebSocket, используя нотацию URL-шаблона сервлета, нотацию URI-шаблона или даже нотацию регулярного выражения.

Если проблема сохраняется после того, как вы это сделаете, тогда кажется, что ваш клиент либо не отправляет заголовок Cookie, который нужен Jetty, либо отправляет неправильный заголовок (например: заголовок Cookie, указывающий на другую / новую ссылку HttpSession).

Перехватите трафик c между вашим клиентом и сервером, обратите внимание на значение Cookie клиента, а также на любые значения Set-Cookie, полученные в ответах от сервера.

Вы в качестве альтернативы может иметь фильтр, который просто выводит активные HttpSession данные при каждом запросе. Убедитесь, что он показывает HttpSession.getId(), HttpSession.isNew() и выводит все атрибуты (через комбинацию вызовов .getAttributeNames() и getAttribute(String name)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...