Может ли апплет связываться с экземпляром сервлета

У меня есть апплет, который общается с сервлетом, используя Http (не сокеты). В настоящее время каждый экземпляр апплета (т. Е. Когда каждый апплет запускается отдельным клиентом на другом компьютере), все экземпляры взаимодействуют с одним и тем же сервлетом. Я хочу, чтобы каждый экземпляр апплета связывался с разными экземплярами одного и того же сервлета. Это возможно?

3 ответа

Решение

Вы не хотите иметь разные экземпляры одного и того же сервлета при жизни веб-приложения. Обычной практикой является использование HttpSession различать клиентов. Вам нужно пройти HttpSession#getId() в качестве параметра для рассматриваемого апплета:

<param name="jsessionid" value="${pageContext.session.id}">

Затем в апплете подключите сервлет следующим образом:

String jsessionid = getParameter("jsessionid");
URL servlet = new URL(getCodeBase(), "servleturl;jsessionid=" + jsessionid);
URLConnection connection = servlet.openConnection();
// ...

Вот servleturl очевидно должен соответствовать сервлету url-pattern в web.xml , Вы также можете установить Cookie заголовок запроса с использованием URLConnection.setRequestProperty(),

Наконец, в Servlet, чтобы получить и сохранить специфичные для клиента данные, выполните следующие действия:

// Store:
request.getSession().setAttribute("data", data);
// Get:
Data data = (Data) request.getSession().getAttribute("data");

Надеюсь это поможет.

Из вашего вопроса кажется, что ваш сервлет содержит состояние. У каждого апплета будет сеанс с контейнером сервлета, к которому ваш сервлет может получить доступ. Вы можете создать объект, который содержит состояние для каждого сеанса, и поместить этот объект в качестве атрибута в сеанс вызывающего абонента. Таким образом, контейнер сервлета может совместно использовать один экземпляр сервлета среди множества клиентов.

Обычный способ обработки действий, специфичных для экземпляра, состоит в том, чтобы информация, хранящаяся в области сеанса, делалась доступной для контейнера сервлета, а не для хранения информации в самом сервлете.

Чтобы это работало, ваш апплет должен правильно отправлять файлы cookie или атрибут JSESSIONID, предоставленный веб-контейнером, или апплет должен запрашивать конкретный URL-адрес экземпляра внутри сервлета.

Я бы посоветовал вам подробнее ознакомиться со спецификацией Servlet API, чтобы узнать больше о том, что вам доступно.

Также обратите внимание, что некоторые серверы приложений поддерживают понятие "клиенты", то есть программы, вызываемые с кодом, обслуживаемым с сервера приложений, которые имеют прямой доступ к внутренней части кода сервера приложений. Фактическое взаимодействие осуществляется библиотеками, также предоставляемыми сервером приложений, так что это просто. Glassfish и Trifork могут сделать это.

Другие вопросы по тегам