Сеанс сервлета HTTPClient - PullRequest
       14

Сеанс сервлета HTTPClient

0 голосов
/ 13 августа 2010

Я получил Servlet A, в котором настроен HTTPClient - объявлен GetMethod, который вызывает Servlet B (в основном, передаю URL в конструктор Servlet B ".

В Servlet BI я устанавливаю некоторые переменные сессиии когда сервлет A возвращает управление после метода «execute», но переменные сеанса, установленные в сервлете B, возвращаются как нулевые.

сервлет A

doPost(req,res)
      {
         HTTPClient client = new HTTPClient();
         GetMethod get =  new GetMethod("/ServletB.do");
         client.execute(get);

         System.out.println("Value of a is :: " + session.getAttribute("a")) ; //gives a NULL
}

сервлет B

doPost(req,res)
{
HTTPSession session = req.getSession();
session.setAttibute("a",a);
session.setAttibute("b",b);

}

Не могли бы вы сообщить мне, какие у меня есть варианты, чтобы обойти эту проблему?

Ответы [ 3 ]

2 голосов
/ 13 августа 2010

У вас есть как минимум две проблемы с вашим кодом:

  • Вам необходимо передать идентификатор сеанса из сервлета A в HTTP-запросе сервлету B. То, как идентификатор сеанса передается между клиентом и сервером, зависит от контейнера, но обычно идентификатор сеанса передается в виде файла cookie HTTP. .

  • Спецификация сервлета не гарантирует, что изменения атрибутов сеанса будут сразу видны всем сервлетам, если несколько сервлетов одновременно получают доступ к одному и тому же сеансу, и один из сервлетов добавляет или заменяет новый атрибут.

Ваш лучший вариант, вероятно, состоит в том, чтобы переместить бизнес-логику в сервлете B в отдельный класс и использовать этот класс как из сервлета A, так и из сервлета B. Или у вас есть другая странная причина для выполнения HTTP-вызова из одного сервлета в другой сервлет внутри одного и того же веб-приложения вместо простого вызова метода?

0 голосов
/ 13 августа 2010

Правильное решение зависит от того, где на самом деле работают эти сервлеты.

  • Если эти сервлеты работают на том же веб-сервере и servletcontext, тогда просто используйте RequestDispatcher#include().Они будут иметь доступ к одному и тому же сеансу.

    request.getRequestDispatcher("/anotherservlet").include(request, response);
    
  • Если эти сервлеты работают на том же веб-сервере , что и , но отличается servletcontext, затем рассмотрите возможность совместного использования сеансов, чтобы они совместно использовали один и тот же сеанс.Непонятно, какой сервлетконтейнер вы используете, поэтому вот лишь пример, нацеленный на Tomcat, чтобы дать вам несколько советов.Просто установите для атрибута crosscontext обоих контекстов веб-приложения значение true:

    <Context crossContext="true">
    
  • Если эти сервлеты работают на другом веб-сервере, то вынеобходимо передать интересующие данные в качестве параметров запроса.Это твоя лучшая ставка, правда.Они не будут и не могут совместно использовать один и тот же сеанс, это было бы дырой в безопасности.

    new GetMethod("http://example.com/ServletB.do?name1=value1&name2=value2");
    

    Если данные относительно велики, рассмотрите общую базу данных, чтобы вам нужно было только передать PKзначение около параметра запроса.

0 голосов
/ 13 августа 2010

Я вижу, что вы вызываете, выполняя 'get' из A, в то время как вы дали код обработки 'post' в B.

Также сеанс, который вы используете для получения параметра с помощью session.getAttribute("a")), отличается от«сессия», видимая B-сервлетом.

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