Как получить сеанс http, созданный URL-адресом в текстовом документе, который будет использоваться при нажатии на ссылку в браузере - PullRequest
1 голос
/ 14 апреля 2009

У меня есть приложение на основе сервлета, которое создает сеанс и сохраняет некоторую информацию при первом обращении к нему. Эта информация используется на последующих страницах. Процесс столкнется с проблемой, если щелкнуть по исходному URL-адресу внутри документа msword. Сервлет создает сеанс и отправляет ответ обратно. Ответ отображается во вновь открытом браузере. Ссылка, нажимаемая изнутри браузера, создает новый сеанс. Любые последующие URL-адреса, нажатые из браузера, повторно используют второй сеанс

Есть ли способ заставить сервер распознать начальный сеанс по второму запросу?

Я создал образец сервлета, который извлекает сеанс и записывает идентификатор вместе с новой ссылкой для обратного вызова.

Ниже приведен тестовый сервлет

public class SessionServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
        StringBuffer sb = new StringBuffer();
        sb.append("<HTML>\r\n<HEAD>\r\n<title>\r\nServlet Session Test\r\n</title>\r\n");
        sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
        sb.append("</HEAD>\r\n<BODY>\r\n");

        HttpSession userSession = request.getSession(true);

        if (userSession.isNew()) {
            sb.append("User Session is new\r\n");
        } else {
            sb.append("User Session is old\r\n");
        }
        sb.append("<br>User Session ID = " + userSession.getId() + "<BR>");

        sb.append("URL <a href=\"http://localhost:9080/myTestApp/SessionTest\"> Session Test </a>");
        sb.append("</BODY> </HTML>\r\n");

        response.setContentType("text/html; charset=UTF-8");
        ServletOutputStream sos = response.getOutputStream();
        sos.write(sb.toString().getBytes("UTF-8"));
    }
}

1 Ответ

0 голосов
/ 05 июня 2009

Установите веб-отладчик типа Fiddler или выполните захват Wireshark , и я уверен, что ваш файл cookie JSESSIONID не отправляется по HTTP-запросу. Я видел это со ссылками из Microsoft Word, которые открываются в IE.

Я изменил ваш код на request.getSession(false), а если вы вернули null, то верните себе response.sendRedirect с дополнительным параметром строки запроса (например, newSession = true), добавленным к URL-адресу. Когда запрос возвращается с этим дополнительным параметром, выполните request.getSession(true). Надеюсь, это найдет существующую сессию, но если нет, то создаст новую сессию. Будьте осторожны, чтобы не помещать ваш код в бесконечный цикл sendRedirect. Это работает, потому что когда IE делает второй HTTP-запрос, он отправляет куки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...