Сервлет Java: Получение ServletContext из WebSocket без HttpSession

#java #servlets #websocket

Вопрос:

В настоящее время я работаю над веб-приложением, которое использует ServletContext для сохранения глобальных данных приложения, доступных для всех сервлетов. Tomcat-это мой сервлет-контейнер.

 @WebListener
public class GlobalData implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        DataTable dataTable = new DataTable();
        ServletContext sc = sce.getServletContext();
        sc.setAttribute("datatable", dataTable);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();
        sc.setAttribute("datatable", null);
    }
}
 

Теперь я хочу расширить приложение с помощью WebSocket.

 public class ExtendedServletConfiguration extends ServerEndpointConfig.Configurator {

    @Override
    public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {

        try {
            Field reqfld = request.getClass().getDeclaredField("request");
            reqfld.setAccessible(true);
            HttpServletRequest req = (HttpServletRequest) reqfld.get(request);
            ServletContext ctxt = req.getServletContext();
            Map<String, Object> up = config.getUserProperties();
            up.put("servletcontext", ctxt);
        } catch (Exception e) {

        }
    } 
}

@ServerEndpoint(value = "/echodata", configurator = ExtendedServletConfiguration.class)
public class AllDataWebsocket {

    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        ServletContext sc = (ServletContext) config.getUserProperties().get("servletcontext");
        DataTable dataTable = (DataTable) sc.getAttribute("datatable");


    try {
        session.getBasicRemote().sendText("connection established");
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}
 

В моем случае в это время сеанса нет, поэтому я не могу получить ServletContext, прочитав сеанс.

Существует ли более сложный способ доступа к глобальным переменным приложений как для сервлетов, так и для веб-сайтов без использования Конфигуратора, Отражений и пользовательских свойств?