| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > как установить сеанс |
| Автор: eXcile 14.3.2007, 09:00 | ||||||||
| Hi all! Возникла следующая проблема: При подключении к серверу, передача данных происходит один раз. Т.е. от клиента идут данные-> на сервлете обрабатываются и обратно апплету. На сервлете создается сессия
Но клиента сервак не запоминает В апплете создается поток, который каждые 2 секунда генерирует передачу данных и соответственно ждет ответа. В init() cоздается само подключение
После первой отправки и получения данных возникает исключение
если же перед каждой отправкой/приемкой данных вставить подключение к серверу все работает.
Почему при каждой отсылке данных, нужно коннектиться к серваку? Как решить эту проблему? |
| Автор: kkorsakoff 14.3.2007, 11:04 |
| На сервере все делаешь правильно, но на клиенте сессия не сохраняется. Есть два механизма сохранения сессии (кукисы и через специальный вид урла, включающий jsessionid), в случае браузера - он сам поддерживает эти механизмы. Если ты создаешь коннекты сам, тебе надо и отслеживать сессию. Первый вариант - использовать apache HttpClient вместо Url.openConnection(). В нем это все уже есть. Но он весит дополнительные X мегабайт, что в апплете нежелательно. Второй вариант - при выполнении самого первого запроса запомни куки, которые тебе вернул сервер. (перебор URLConnection.getHeaderFields() на предмет заголовка "Set-Cookie") . Тебе нужен куки под названием jsessionid. Запомни его значение. Затем в каждом последующем запросе вставляй в запрос. URLConnection.setHeaderField("Cookie",...) P.S. В Java1.6 механизм кукисов вроде был упрощен Добавлено @ 11:05 Почитай тут с примерами кода http://www.hccp.org/java-net-cookie-how-to.html Добавлено @ 11:07 P.S. Коннектиться надо каждый раз потому что так устроен протокол HTTP (запрос-ответ). На самом деле вполне возможно что реальный TCP коннект и не создается каждый раз, но тебя как программиста это не должно интересовать. А чем не устраивает текущее положение дел? |
| Автор: eXcile 14.3.2007, 11:32 |
Приложение только пишется и отлаживается. В дальнейшем сервак возможно будет поставлен в INet'e, а такое соединение никуда негодится (не хотелось бы чтоб Юзвери коннектились по тысячу раз). (: При отладке наткнулся на следующую вещь: при создании сессии в doPost() header jsessionid не создавался, когда сессия создается в doGet() header jsessionid появляется. Почему? |
| Автор: Predator83 14.3.2007, 15:16 |
| При post запросе данные передаются в теле запроса, а при get - в заголовке. |
| Автор: kkorsakoff 15.3.2007, 12:09 | ||
1. Установление нового соединения = 3 IP пакета по 40 байт плюс Http запрос/ответ. Что за такое приложение, где это критично? 2. Возможно, новое соединение и не устанавливается каждый раз (есть такая вещь, как http Connection: Keep-Alive) Вроде бы она реализована как раз в HttpClient от Jakarta http://jakarta.apache.org/commons/httpclient/index.html Хороший пакет. Очень рекомендую ознакомиться, если собираешься хоть сколько работать с Http-протоколом. Стандартная Sun'овская реализация написано ужасно примитивно. Насчет второй части твоего сообщения не очень понял. Ты хочешь сказать, что если ты делал POST запрос - сервер не ставил Set-Cookie: jsessionid....? |