Главная » Java, Web, XML » Сеанс связи с Axis

0

Еще одна интересная особенность Axis — он может установить сеанс связи с клиентом. Сеанс связи описан интерфейсом session, реализованным двумя классами — классом simplesession, работающим через заголовок SOAP- послания, и классом AxisHttpSession, создающим сеанс связи через серв- лет при помощи cookie [10].

В первом случае в заголовок SOAP-послания записывается блок <sessioniD>, содержащий уникальный идентификатор сеанса. Все действия по его записи и проверке выполняются методами класса SimpleSessionHandler. И в клиенте и в сервере должно находиться по экземпляру этого класса.

Во втором случае обычным образом записываются и проверяются поля set- Cookie И Cookie [10] HTTP-заголовка.

Методы сеанса

Интерфейс            описывает метод

public void set (String key, Object value) ;

задающий идентификатор сеанса key со значением value.

Все идентификаторы сеанса можно получить методом

public Enumeration get Keys () ;

а значение отдельного идентификатора key — методом

public Object get (String key) ; Идентификатор key удаляется методом public void remove (String key) ;

Сеанс завершается, когда в течение времени timeout, определенного методом

public void setTimeout(int timeout);

не было выполнено ни одного действия. Время отсчитывается в секундах. Узнать это время можно методом

public int getTimeout();

Если надо продлить сеанс, то можно воспользоваться еще одним методом

public void touch();

интерфейса              Этот метод "помечает" сеанс связи, сообщая, что он

только что использовался.

Класс simplesession реализует все методы интерфейса session, добавляя к ним конструктор по умолчанию, начинающий сеанс связи, и метод public long getLastAccessTime () ;

возвращающий время последнего действия в сеансе.

Класс AxisHttpSession работает в сервлетах в рамках сеанса класса экземпляр которого передается или записывается прямо в

конструкторе

public AxisHttpSession(HttpSession session); или косвенно, через запрос req, в конструкторе publicteisHttpSession (HttpServletRequest req) ;

Поэтому, кроме методов интерфейса session, в нем есть методы доступа к сеансу сервлета

public void setRep(HttpSession session); public HttpSession getRep();

Создание сеанса средствами Axis

Хотя разработчик может "вручную" создать сеанс связи с Web-службой методами классов simplesession И AxisHttpSession, В Axis есть средства, автоматизирующие этот процесс. Рассмотрим простейший пример Web- службы, которая при первом обращении к ней запоминает имя клиента и использует его в дальнейшей работе с тем же клиентом. Эта Web-служба приведена в листинге 3.17.

* Листинг 3.17. Web-служба, использующая сеанс связи

public class HelloSession{

private String lastName = "";

public String sayHello (String name){

String resp = "";

if (name.equals(lastName))

resp = "Рады снова видеть Вас, "; else resp = "Здравствуйте, ";

lastName = name;

return resp + name + "\n";

}

}

Для того чтобы Axis организовал сеанс связи с Web-службой HelloSession, не создавая при каждом обращении к ней новый экземпляр, в ее конфигурационном файле надо записать элемент <parameter>, дающий значение "Session" параметру "scope":

<deploynent xmlns="http: //xml.apache.org/axis/wsdd/"

xmlns:j ava="http://xml.apache.org/axis/wsdd/providers/j ava">

<service name="HelloSession" provider="java:RPC">

<parameter nama="classNama" value="HelloSession" />

<parameter name="nethcdNane" value=" sayHello" /> <parameter name="scope" value="Session"/>

</service>

</deployment>

Если Web-служба создается по ее описанию WSDL, то достаточно при вызове утилиты    записать параметр -d session, как это сделано в примере использования этой утилиты, приведенном выше.

Это еще не все. Сервер создаст сеанс связи только по прямому указанию клиента. Указание дается обращением к методу

public void setMaintainSession (boolean session);

класса-заглушки stub, реализующего в Axis одноименный интерфейс системы      Axis, точнее, утилиты  или      автоматически создают расширение класса stub, в нашем примере имя этого расширения — HelloSessionSoapBindingStub. Все вместе выглядит так, как показано в листинге 3.18.

Клиент, записанный в листинге 3.18, пользуется Web-услугой sayHelloO два раза. Первый раз Web-услуга говорит ему: "Здравствуйте, ", второй раз — "Рады снова видеть Вас, ".

ЛистингЗ.18. Клиент Web-службы, создающий сеанс связи

public class

public static void main (String [ ] args) { String name = "" ;

if (args[0] != null) name = args[0];

// Класс-фабрика HelloSession создан утилитой WSDL2Java. HelloSession fact = new HelloSession () ;

HelloSessionPortType service =

fact.getHelloSessionPort();

HeiioSessionSoapBindingStub stub =

(HeiioSessionSoapBindingStub)service; stub.setMaintainSession(true); try{

System.out.println(service.sayHello(name)); System.out.println(service.sayHello(name));

}catch(Exception e) {

System.out.println(e) ;

}

)

}

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

Tags:

По теме:

  • Комментарии