Сервис сессий это элемент инфраструктуры, обеспечивающий автоматизацию использования программистом шаблона проектирования evitor.
Суть этого шаблона заключается в следующем:
SessionExpireTime.
SessionId.
Если операция восстановления состояния по SessionId не была вызвана в
течении SessionExpireTime, то сервис сессий имеет право удалить соответствующий набор переменных, генерируя исключение во время операции
восстановления состояния.
С теорией ясно, теперь посмотрим на сокращенное описание 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 основных метода:
username, устананвливая период неактивности сессии в
SessionExpireTime
id, если
сессия не уничтожена.
id.
Осталось только выяснить: что такое контекст сессии 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.