Что такое сеанс в Java?

До сих пор я понимаю концепции Httpsession в 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. Это фактический способ установить этот атрибут? Или, реальные разработчики приложений дадут переменную в поле "String", чтобы установить ее динамически

(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.

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

  • Пользователь сначала регистрируется на веб-сайте.
  • Контейнер сервлета устанавливает COOKIE на пользовательский браузер, сохраняющий UNIQUE JSessionID.
  • Каждый раз, когда пользователь ударяет веб-сайт, cookie JSESSIONID отправлено обратно.
  • Контейнер сервлета использует это для следить за тем, кто есть кто.
  • Точно так же он отслеживает разделения данных. каждый у пользователя есть своя ведро объекты, однозначно идентифицированные JSESSIONID.

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

Приветствия

Ответ 4

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

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, он просто делает то же самое, что и выше, как правило, объект Request не передается в этот метод, поэтому вы используете 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);
}
}