На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

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

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Cookies , запись инфы в cookies
    Я пишу прогу в CGI интерфейсе. Как можно запоминать какого-то юзера, который зашел на страничку, сгенеренную этой прогой?
    Сначала я отсылаю его в процедуру регистрации:
    procedure TwbmdLibrary.wbmdLibrarywbactitmAuthorizAction(Sender: TObject;
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    begin
    //проверяем пользователя
    if Такой_Юзер_Есть=true then
    //если у него есть разрешение на что-то (это не важно), то пишем в кукисах, что он "свой"
    with Response.Cookies.Add do
    begin
    Name := 'LastName';
    Value := Request.QueryFields.Values['NameAuth'];//берется из поля ввода, где вводится имя
    if Value = '' then
    Value := Request.CookieFields.Values['LastName'];
    Secure := True;
    Expires := Now + 1;//сохраняем этот cookie в течение суток
    end;
    end;

    потом в другой процедуре я пытаюсь прочитать этот кукис, но он почему-то к тому времени уже пуст:
    Request.CookieFields.Values['LastName'] всегда пуст и даже
    Response.Cookies.Count всегда равен 0
    Как быть?
      Проверь время действие кука - и процедура запускается при томже обращении или нет ?
        дык я ж его даже прочитать не могу, т.к. он пуст. Как же я могу прочитать время его действия?
        А процедура вызывается по-любому, там же ошибок нету, чего ей не запуститься?
          Да ни прич чтении чекать а при записи указать
            да. я при записи же и указываю
            Expires := Now + 1;//сохраняем этот cookie в течение суток
            а потом он почему-то не читается..... точнее не читался. Сейчас у меня другой бред.
            в общем вот:
            при входе на страничку юзеру подгружается обычная (типа для Гостя). Если он указывает имя и пароль, при нажатии на "Вход" идет поиск этого юзера в БД. Если все ОК (если он там есть), то опять происходит запись в кукис и автоматом вызывается первая процедура.
            В ней-то и читается этот кукис и в ней же смотрится. если этот юзер был, то грузится страница уже не для Гостя, а для Своего
            Так вот. Новый берд заключается в том, что этот кукис читается через раз. Т.е. мы записываем что-то и это что-то считывается только на второе чтение...
            например:
            1. вошли, ввели Login: Vasia Pass: Pupk
            2. читаем - пусто
            3. опять просто вводим Login: abc Pass: 123
            4. читаем - Vasia, Pupk
            5. вводим Login: qwerty Pass: 0987
            6. читаем abc, 123...............................
            можно ничего не вводить, т.е. просто жать "войти", тоже самое - т.е. то, что было в полях ввода в позапрошлый раз, то и выводится. Т.е. не в ПРОШЛЫЙ, а в ПОЗАпрошлый
              Оно даёт либо не в течении суток а в течении секунды smile.gif
              тогда надо ставить Now + 3600*24
              Либо где ктото не правильно переводит время ...

              Добавлено в
              Кукис читается на следующем запросе после сохранения
                Now возвращает полную дату, где целое число - это кол-во дней от 31.12.1899, а число после запятой указывает кол-во миллисекунд с начала суток
                Прибавляя 1 к Now, мы увеличиваем время жизни Cookies'а на сутки, а не на секунду.
                Вот если бы мы прибавили что-то типа 1/(24*3600), тогда увеличили бы на секунду...
                Понял только что (раньше пробовал, но почему-то не получалось)...
                Короче, надо было страничку обновлять Ctrl+R, чтобы очистить кэш, тогда кукис нормально читается. Но опять повторюсь, раньше почему-то не получалось (но возможно от монотонности задачи меня глючило (постоянно смотреть один и тот же результат) и поэтому я что-то не так делал)
                В общем, все ок вроде smile.gif
                  не..... опять тупизм....
                  когда я вошел и потом просто жму Ctrl+R - все ОК. Он мне пишет "Здравствуйте, <UserName>"
                  Но когда я пытаюсь что-то нажать (у мя там есть формы с кнопками, типа "Показать" и т.п.), он мне опять потом пишет, что я гость.... Т.е. кукис очищается (я даже время жизни поставил now+1*24*3600, что явл. 236 лет....)
                  Вщм, если просто чистить кэш, то все ок, а если по форме обновить (нажать какую-нть кнопку), то кукис почему-то чистится весь и в нем ничего нету...
                    по ходу еще один вопрос:
                    как послать кукис?
                    т.е. я могу прочитать его только при след. обращении к какой-то процедуре, а мне надо, чтобы можно было и в этом же.
                    Пример:
                    //в этой процедуре я обновляю кукис
                    procedure MyProc(Sender: TObject;
                    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
                    var MyCook:TStrings;
                    User,Pass:string;
                    begin
                    ...
                    MyCook:=TStringList.Create;
                    MyCook.Clear;
                    MyCook.Add('LastLogin='+User);
                    MyCook.Add('LastPassword='+Pass);
                    MyCook.Add('LastVisit='+FormatDateTime('dd mmmm yyyy hh:mm:ss',now));
                    Response.SetCookieField(MyCook,'','',now+1,true);
                    {***}
                    MyCook.Free;
                    end;

                    procedure TMyWebModule1.WebActionItem1Action(Sender: TObject;
                    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
                    begin
                    MyProc(Request, Response);//обновляем кукис
                    Request.CookieFields.Text;//возвращает старый кукис, который мы писали в прошлый раз, а мне нужен новый, который уже обновили (предыдущая строка)
                    end;

                    Мне надо в месте {***} как-то послать этот кукис, чтобы он обновился... Как это можно сделать (если вообще можно)? Или я что-то не так сделал?
                    Сообщение отредактировано: Voice -
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0242 ]   [ 16 queries used ]   [ Generated: 28.04.24, 07:42 GMT ]