Я думаю, что у вас может быть несколько запутанных понятий, надеюсь, это объяснение будет иметь смысл и поможет вам разобраться.
Сеанс живет на вашем сервере приложений.После создания он передается в ваш браузер с помощью файла cookie (часто называемого JSESSIONID).Когда ваш браузер передает этот файл cookie веб-серверу как часть запроса, сервер может извлечь сеанс и связанные с ним объекты (должны быть сериализуемыми, см. Другие вопросы SO), которые уже были присоединены к этому сеансу (при условии, что этот сеанс не истек)).
Поскольку эти переменные сеанса живут только на сервере, они используются сервером для построения ответа, данного клиенту.Но чтобы получить ответ, ваш клиент должен сделать запрос.Вы сделали запрос и изменили состояние первой вкладки, но поскольку вторая вкладка не сделала собственный запрос, ее состояние не обновилось.(Поскольку эти вкладки находятся в одном и том же браузере, они совместно используют файл cookie сеанса и извлекают один и тот же сеанс для выполнения своих запросов).С некоторыми дополнительными возможностями вы можете использовать некоторые технологии на стороне клиента, такие как AJAX, для периодического выполнения небольших запросов о состоянии сеанса и обновления отображения окон вашего браузера.(Вы можете различать такие запросы, вызывая их для вызова другого ресурса или разных типов принятия запроса).
Теперь с дизайном вашего кода ... Я не смотрел на него слишком подробно, но вы, возможно, захотите проработать свой поток немного больше.Кажется, GET всегда сбрасывает ваш тест и сообщение продолжает его?(Мне это немного странно, но я не могу понять, почему ... Я бы порекомендовал почитать REST и дизайн, созданный на основе этого. JAX-RS и Jersey довольно милы:)).
Редактировать: Вот гораздо более простой сервлет, с которым вы можете играть.Поместите его в войну и откройте 2 вкладки, одну только для самого сервлета, а другую, добавив строку запроса? CheckOnly = true.Поиграйте с обновлением каждой вкладки независимо и посмотрите, что происходит с графом.
package test.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Counting servlet counts the number of requests to it.
* @author Charlie Huggard-Lee
*/
@SuppressWarnings("nls")
public class CountingServlet extends HttpServlet {
/**
* The serialVersionUID.
*/
private static final long serialVersionUID = 4279853716717632192L;
/**
* {@inheritDoc}
*/
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws IOException {
final HttpSession session = req.getSession();
AtomicInteger counter = (AtomicInteger) session.getAttribute("Count");
if (counter == null) {
counter = new AtomicInteger();
session.setAttribute("Count", counter);
}
final boolean checkOnly = Boolean.parseBoolean(req.getParameter("checkOnly"));
final int thisCount;
if (checkOnly) {
thisCount = counter.get();
} else {
thisCount = counter.getAndIncrement() + 1;
}
resp.setStatus(200);
resp.setHeader("Content-Type", "text/plain"); //$NON-NLS-1$ //$NON-NLS-2$
resp.setCharacterEncoding("UTF-8"); //$NON-NLS-1$
final PrintWriter writer = resp.getWriter();
if (session.isNew()) {
writer.append("Hey new user!\n");
} else {
writer.append("Welcome Back!\n");
}
writer.append("Session ID: ");
writer.append(session.getId());
writer.append("\n");
if (checkOnly) {
writer.append("(checking) ");
}
writer.append("Count: ");
writer.append(Integer.toString(thisCount));
}
}