2010-09-08 3 views
10

До сих пор я понимаю концепции Httpsession в Java.Что такое сеанс в Java?

HttpSession ses = req.getSession(true); 

будет создавать объект сеанса в соответствии с запросом.

setAttribute("String", object); 

будет связывать «String» и значение с объектом Session.

getAttribute("String"); 

будет возвращать объект, связанный с указанной строкой.

То, что я не в состоянии понять: я создаю объект сеанса, как HttpSession ses = req.getSession(true); и установив для него имя по телефону setAttribute("String", object);. Здесь этот код находится внутри сервера. Для каждого человека, когда он пытается войти в систему, будет выполнен один и тот же код на сервере. setAttribute("String", object); в этом методе строковое значение является константным. Таким образом, каждый созданный объект сеанса будет привязан к той же строке, которую я предоставил. Когда я пытаюсь получить строку для проверки его сеанса или при выполнении действия выхода из системы, возвращается getAttribute("String"); ll то же самое постоянное строковое значение (Я прав !! Фактически я не знаю, я просто думаю о его логике исполнения). Затем, как я могу быть недействительным.

Я видел этот тип иллюстрации во всех учебниках на WEB. Это фактический способ установить этот атрибут? Или, реальные разработчики приложений будут давать переменной в поле «Строка», чтобы установить его динамически

(ie. session.setAttribut(userName, userName); //Setting the String Dynamically.. I dono is it right or not.)

И мой последний вопрос

WebContext ctx = WebContextFactory.get(); 
request = ctx.getHttpServletRequest(); 

Что две строки выше делать? Что будет храниться в ctx &? HttpSession ses = req.getSession(true); создаст новые средства сеанса. Какое значение хранится в ses.

+28

О, дорогая, вам пришлось ждать всего 10 минут для первого ответа ... :-P –

+1

Сессия связана с одним пользователем. У двух разных пользователей разные сеансы. Если вы хотите поделиться чем-то с одним и тем же пользователем, используйте setAttribute для объекта сеанса.Если используется более одного использования, используйте контекстный объект. Вы также можете обмениваться объектами, привязывая объект запроса. –

ответ

14

Некоторые [случайные]: уточнения

  1. Вам не нужны механизмы Логин/выхода из системы для того, чтобы иметь сессий.
  2. В сервлетах Java HTTP-сеансы отслеживаются с использованием двух механизмов, HTTP-файлов cookie (наиболее часто используемых) или перезаписи URL-адресов (для поддержки браузеров без куки-файлов или с отключенными файлами cookie). Использование только файлов cookie просто, вам не нужно ничего особенного делать. Для повторной записи URL вам необходимо изменить все URL-адреса, указывающие на ваши сервлеты/фильтры.
  3. Каждый раз, когда вы вызываете request.getSession(true), объект HttpRequest будет проверен, чтобы найти идентификатор сеанса, закодированный либо в файле cookie OR/AND в параметре пути URL (что следует за точкой с запятой). Если идентификатор сеанса не найден, новый сеанс будет создан контейнером сервлетов (то есть сервером).
  4. Идентификатор сеанса добавляется к ответу в виде файла cookie. Если вы хотите также поддерживать повторную запись URL-адресов, ссылки в ваших HTML-документах следует изменить с помощью метода response.encodeURL(). Вызов request.getSession(false) или просто request.getSession() вернет значение null, если идентификатор сеанса не найден или идентификатор сеанса ссылается на недействительный сеанс.
  5. Существует один сеанс HTTP на ., так как куки-файлы сеансов Java не хранятся в браузере постоянно. Таким образом, объект сеанса не разделяется между клиентами. У каждого пользователя есть своя приватная сессия.
  6. Сессии автоматически уничтожаются, если не используются в течение заданного времени. Значение тайм-аута можно настроить в файле web.xml.
  7. Данный сеанс может быть явно аннулирован с использованием метода invalidate().
  8. Когда люди говорят о JSESSIONID, они ссылаются на стандартное имя HTTP-файла cookie, используемого для выполнения отслеживания сеанса в Java.
11

Предлагаю вам прочитать tutorial на сеансах Java. Каждый пользователь получает другой объект HttpSession на основе параметра запроса/ответа JSESSIONID, который веб-сервер Java отправляет в браузер. Таким образом, каждый пользователь может иметь атрибут с тем же именем, а значение, сохраненное для этого атрибута, будет отличаться для всех пользователей.

Кроме того, WebContextFactory и WebContext являются классами DWR, которые обеспечивают простой способ получения параметров сервлета.

+0

Не совсем уверен, почему это было приостановлено. – Pat

+0

Да, я знаю это. Но я не могу понять, что будет храниться в этой переменной «ctx» и «request». Вот что я спросил там. Что такое WebContextFactory и WebContext? Что они будут делать? – 2010-09-08 13:37:16

+2

Вы взглянули на javadocs для этих классов? HttpServletRequest: http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html, WebContextFactory: http://www.jarvana.com/jarvana/view/org/directwebremoting/dwr/ 2.0.3/dwr-2.0.3-javadoc.jar! /org/directwebremoting/WebContextFactory.html и WebContext: http://www.jarvana.com/jarvana/view/org/directwebremoting/dwr/2.0.3/ dwr-2.0.3-javadoc.jar! /org/directwebremoting/WebContext.html –

8

Насколько я понимаю, ваши проблемы касаются разделения разных пользователей при хранении вещей в HttpSession.

Контейнер сервлетов (например, Tomcat) заботится об этом, используя свой JSESSIONID.

история выглядит следующим образом:

  1. первого вход на сайт.
  2. Контейнер сервлета устанавливает COOKIE на в браузере пользователя, хранящем UNIQUE jsessionId.
  3. Каждый раз, когда пользователь попадает на сайт , cookie JSESSIONID отправляется обратно .
  4. Контейнер сервлета использует это для отслеживать, кто есть кто.
  5. Точно так же он отслеживает разделение данных на . Каждый пользователь имеет свое собственное ведро объектов, однозначно идентифицированных JSESSIONID.

Надеюсь, что (хотя бы частично) ответит на ваш вопрос.

Приветствия

+0

Да, вы ответили за половину моего вопроса. Что мне нужно сделать, чтобы аннулировать сеанс (например, как удалить объект сеанса для определенного человека, который нажимает кнопку «Выход»)? – 2010-09-08 13:42:22

+0

Я считаю, session.invalidate() убивает сессию, поэтому, когда пользователь на следующий раз попадает на сайт, процесс начинается. – lucas1000001

+0

Обратите внимание, что объект сеанса не является обходным файлом для пользователей - каждый пользователь имеет свой собственный объект! – lucas1000001

3

Ваш основной сервлет будет выглядеть

public class MyServlet{ 

public doGet(HttpServletRequest req, HttpServletResponse res){ 
//Parameter true: 
// create session if one does not exist. session should never be null 
//Parameter false: 
// return null if there is no session, used on pages where you want to 
// force a user to already have a session or be logged in 
//only need to use one of the two getSession() options here. 
//Just showing both for this test 
HttpSession sess = req.getSession(true); 
HttpSession sess2 = req.getSession(false); 

//set an Attribute in the request. This can be used to pass new values 
//to a forward or to a JSP 
req.setAttribute("myVar", "Hello World"); 
} 

} 

Там нет необходимости устанавливать какие-либо имена атрибутов для сеанса, уже сделано. Как другие предложили в других ответах, используйте файлы cookie или переписывание URL-адресов для хранения идентификатора sessionID для вас.

Когда вы имеете дело с DWR WebContext, он просто делает то же самое, что и выше, только обычно объект запроса не передается в метод, поэтому использовать WebContext, чтобы получить этот запрос для Вас

public class DWRClass { 
public doSomething(){ 
WebContext ctx = WebContextFactory.get(); 
HttpServletRequest req = ctx.getHttpServletRequest(); 
HttpSession sess = req.getSession(); //no parameter is the same as passing true 

//Lets set another attribute for a forward or JSP to use 
ArrayList<Boolean> flags = new ArrayList<Boolean>(); 
req.setAttribute("listOfNames", flags); 
} 
}