У меня небольшая проблема с HttpSession.Я использую Jetty 8 и пытаюсь реализовать встроенный веб-сервер.
Для целей тестирования я создал два сервлета:
- FileServlet: он просто обрабатывает HTTP GET для статического содержимого, например индекса.html, css и другие статические файлы и печатает текущий идентификатор сеанса на консоли:
System.out.println ("Файловый сеанс:" + request.getSession (true) .getId() + "путь" + request.getPathInfo ());
- TestServlet: ничего не делает, он просто печатает идентификатор текущей сессии на консоли в doGet (...)
System.out.println ("Тестовый сеанс:" + request.getSession (true) .getId () + "путь" + request.getPathInfo ());
Насколько я знаю, сервлеты должны быть частью одного и того же ServletContext, чтобы правильно обрабатывать сеансы.Поэтому я реализую это программным способом следующим образом:
Server server = new Server(8081);
ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
servletContext.setContextPath("/");
servletContext.addServlet(new ServletHolder(new FileServlet()),"/*");
servletContext.addServlet(new ServletHolder( new TestServlet()),"/servlets/test");
server.setHandler(servletContext);
Теперь я запускаю свой веб-браузер (кстати, Chrome), очищаю браузеры, файлы cookie и браузеры чаю и загружаю свой тестовый сайт http://localhost:8081/index.html, который также запроситдля загрузки других статических файлов, таких как css и js.
Итак, теперь я получаю следующий вывод:
File session: ok49uty1mshn1fnhyle9ojh3n path /index.html
File session: 1fuxdd50woxwv1gl9r96dfdxgl path /css/style.css
File session: 1f6m5dkht4xja5ryj7dgd93wu path /css/Loading.css
File session: 1qizt3gnyy58uj0u46kofbxdf path /css/photo.css
File session: ikzpmgyew49uwxlnt8lr839m path /css/Login.css
File session: pg6p843xuqak1uwcc68q8wnxx path /js/script.nocache.js
File session: 1uv2jmvpu5u6s127rpc01ef8 path /js/script2.js
После загрузки index.html и всех других ресурсов, встроенных в index.html.(CSS и JS) я звоню http://localhost:8081/servlets/test, и я вижу этот вывод:
Test session: 1uv2jmvpu5u6s127rpc01ef8 path /servlets/test
Так что мне кажется, что требуется некоторое время, чтобы установить сеанс, и мне интересно, почему и какпусть первый сеанс, который был создан HTTP GET из /index.html, будет сеансом для каждого дальнейшего взаимодействия с сервером.Это очень странно.
Я также провожу второй эксперимент: как я уже говорил, я очистил кеш браузера и куки перед загрузкой /index.html.На этот раз я перезагружаю страницу без очистки кеша и куки, и теперь она работает правильно или, другими словами, как я ожидаю работать:
File session: 1uv2jmvpu5u6s127rpc01ef8 path /index.html
File session: 1uv2jmvpu5u6s127rpc01ef8 path /css/style.css
File session: 1uv2jmvpu5u6s127rpc01ef8 path /css/Loading.css
File session: 1uv2jmvpu5u6s127rpc01ef8 path /css/photo.css
File session: 1uv2jmvpu5u6s127rpc01ef8 path /css/Login.css
File session: 1uv2jmvpu5u6s127rpc01ef8 path /js/script.nocache.js
File session: 1uv2jmvpu5u6s127rpc01ef8 path /js/script2.js
А также / servlets / test имеют тот же сеанс:
Test session: 1uv2jmvpu5u6s127rpc01ef8 path /servlets/test
РЕДАКТИРОВАТЬ: я понимаю, что мой браузер не ждет полной загрузки index.html и начинает загружать CSS и JS в то же время ... Но мне действительно нужно иметь возможность определить изПервый HTTP ПОЛУЧИТ «настоящий» сеанс по некоторым причинам безопасности.Есть предложения?