Может ли апплет связываться с экземпляром сервлета
У меня есть апплет, который общается с сервлетом, используя 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 могут сделать это.