next_inactive up previous


CASL: Sessions API: Руководство Программиста
DocumentId:GradSof-CASL-Sessions-r-PG-08.07.2002-1.0.0

Введение

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

Суть этого шаблона заключается в следующем:

API

С теорией ясно, теперь посмотрим на сокращенное описание API. (Полное описание API можно увидеть в API Guide ).

Сервис

namespace CASL
{
 
   class SessionService: public CASL::Service
   {
    public:

     struct SessionExpired: public CASL::Exception
     ..........

     struct InvalidSessionId: public CASL::Exception
     ..........

     struct TooManySessions: public CASL::Exception
     ..........

     struct UsernameMismatch: public CASL::Exception
     ..........

     /**
      * create Session 
      **/
     virtual SessionContextWrapper createSession(const char* username,
                                                 time_t nSecondsToExpire=0) = 0;
                                           

     /**
      * get SessionContext by id.
      * throw SessionExpiredException or InvalidSessionId
      **/
     virtual SessionContextWrapper getSessionContext(SessionIdType id, 
                                               const char* username) = 0;

     /**
      * end session.
      **/
     virtual void  releaseSession(SessionContextWrapper sessionContext) = 0;


     // Service stuff:

     ///
     bool  requireThread() { return true; }

   };


}

Как мы видим, это сервис предоставляющий API, у которого есть 3 основных метода:

Осталось только выяснить: что такое контекст сессии SessionContext и почему он возвращается как SessionContextWrapper.

Контекст сервиса

Ну что-же: опять смотрим на описание API

Или здесь:

namespace CASL
{

  typedef std::string  SessionIdType;

  class SessionContext : public Context
  {
  public:

    SessionIdType  getSessionId() const;

    const char*    getUsername() const;

    time_t         getExpireTime() const;

    bool  checkUsername(const char* username);

    void  touch() const;

    ValuesSlot&  getDefaultValuesSlot();

    ValuesSlot&  getValuesSlot(const char* name);
    ValuesSlot&  getValuesSlot(int index);

  private:
 
    ..............

  };

Как видим, SessionContext это просто обычный CASL-контекст (совокупность именованных слотов), дополненный дополнительными атрибутами id, username - имя пользователя, которому принадлежит эта сессия, expireTime и выделенным слотом, в котором храняться значения.

Осталось прояснить, почему мы возвращаем SessionContextWrapper а не сам SessionContext.

Опять смотрим на определения:

  class SessionContextWrapper
  {
   public:

    ......

    SessionContext* operator->();

    SessionContext& operator*();

    bool isNULL() const

    SessionContextWrapper(const SessionContextWrapper& x)

    SessionContextWrapper& operator=(const SessionContextWrapper& x)

  };


}

Видим, что SessionContextWrapper это просто ``слабый указатель'' (WeakPointer) на SessionContext.

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

SessionContextWrapper просто проверяет при доступе к контексту: а не уничтоженна ли соответствующая сессия, и если она действительно уничтоженна - генерирует исключение SessionExpired.

Пример: использование слота контекста

Можно найти в дистрибутиве исходных кодов CASL.

Перечень изменений

  1. 03.09.2002 - пересмотр.
  2. 08.07.2002 - первая редакция.



GradSoft