#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, прочитав сеанс.
Существует ли более сложный способ доступа к глобальным переменным приложений как для сервлетов, так и для веб-сайтов без использования Конфигуратора, Отражений и пользовательских свойств?