На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> Как сказать jQuery чтоб он сохранял куки при выполнении ajax запроса?
    Всем привет.

    Есть два приложения: app1, app2

    Первое приложение(app1) делает запросы через ajax на котроллер второго(app2).
    У второго приложения(app2) внутри есть своя HTTP сессия, в которую сохраняются какие то данные.
    Так вот при повторном обращении к контролеру, данных(которые я уже добавил в сессию в предыдущем вызове) - нет. Есть подозрения что при выполнении ajax из JS, он просто не сохраняет куку, и данные теряются вместе с сессионной кукой.

    Подробнее:
    Допустим я делаю ajax запрос:
    ExpandedWrap disabled
              $.ajax({
                  type: 'POST',
                  url: URL,
                  contentType: "application/json; charset=utf-8",
                  data: JSON.stringify(data),
                  dataType: "json",
                  xhrFields: {
                      withCredentials: true
                  },
                  crossDomain: true
              })
          });


    Попадаю внутрь метода своего API контроллера, в котором пишу:
    ExpandedWrap disabled
      HttpContext.Session.SetString(NameKey, "This is change name variable");


    Так вот когда повторно я попадаю в любой метод этого же контроллера из ajax, у меня моя сессия пустая.
    А я хочу чтоб она содержала мой ключ и значение, которое я сохранил ранее.

    Добавлено
    Еще одно уточнение - все это работает, если тестировать на 1 приложении. Т.е. на одном приложении все ajax запросы отрабатывают норм. Как только обращаемся через кросс домен к другому приложению - сессия не сохраняется :-?
      Киля, готового кода или исправления не предоставлю, но постараюсь помочь ...
      Вся твоя шляпа в виде фрэймворков зиждется на простом жаба-скрипте.
      Возьми и задебажь "по-сырому". Для это запили в систему что-то типа WinShark,
      отлови всю последовательность HTTP-пакетов, ну и зацени на каком этапе "что-то" пошло не так.
      Если есть два app - проблем нет, просто виртуализируй их на локальном хосте.
      Ну, и ясный перец, проблем там где вход норм, а выход нет (допустим должен ставить куки, а не ставит).
      Уверен, что последовательность сырых запросов тебе поможет распознать врага! :victory:
        Цитата JoeUser @
        Если есть два app - проблем нет, просто виртуализируй их на локальном хосте.

        Оно и так на одном хосте. обращаюсь к http://localhost:5000/api/Controller/Method. :yes-sad:


        Цитата JoeUser @
        Ну, и ясный перец, проблем там где вход норм, а выход нет (допустим должен ставить куки, а не ставит).
        Уверен, что последовательность сырых запросов тебе поможет распознать врага!

        У меня есть подозрения(почти на 99%) что это из за CORS. Я вчера колупал и заставил все это работать! Но для этого мне пришлось залезть в настройки IE, и включить опцию "Доступ к источникам данных за пределами домена" это в свойствах браузера -> "параметры безопасности - зона Интернета". После чего данные начали сохранятся в сессии, по умолчанию эта настройка отключена.
        Плюс я нагуглил вот такое вот:
        CORS $.ajax session cookies (access-control-allow-credentials & withCredentials=true)
        Why is jquery's .ajax() method not sending my session cookie?
        Я в принципе уже понял в чем проблема. Но я не могу понять как ее обойти, чтоб работало. Уже и заголовки добавлял, хз что ему еще надо. :-?
        Не работает и все тут.

        Добавлено
        Вот в последней ссылке чувак пишет:
        Цитата

        AJAX calls only send Cookies if the url you're calling is on the same domain as your calling script.

        This may be a Cross Domain Problem.

        Maybe you tried to call a url from www.domain-a.com while your calling script was on www.domain-b.com (In other words: You made a Cross Domain Call in which case the browser won't sent any cookies to protect your privacy).

        In this case your options are:

        Write a small proxy which resides on domain-b and forwards your requests to domain-a. Your browser will allow you to call the proxy because it's on the same server as the calling script.
        This proxy then can be configured by you to accept a cookie name and value parameter which it can send to domain-a. But for this to work you need to know the cookie's name and value your server on domain-a wants for authentication.
        If you're fetching JSON objects try to use a JSONP request instead. jQuery supports these. But you need to alter your service on domain-a so that it returns valid JSONP responds.

        Glad if that helped even a little bit.


        Вот я не понимаю - это он серьезно, или можно это обойти, чтоб не писать какие то прокси-прокладки?
          Wound, Киля, повторюсь ... не мне тебя учить - иди от лов-левела к хай.
          Сперва лови сырое виншарком. Это тебе будет писча :) для размышлений.
          А как выловишь непотребство, вот тогда и ищи его в коде.

          И да ... если код идеален - третьим шагом смари настройки браузеров.
          Да пребудет с тобой сила! :victory:

          ЗЫ: На IE положи болт! Это говно-браузер, который маст дай. Тести под Хромом или Мазилой.
            Цитата JoeUser @
            Wound, Киля, повторюсь ... не мне тебя учить - иди от лов-левела к хай.
            Сперва лови сырое виншарком. Это тебе будет писча для размышлений.
            А как выловишь непотребство, вот тогда и ищи его в коде.

            Да уже сижу в фидлере...

            Цитата JoeUser @
            И да ... если код идеален - третьим шагом смари настройки браузеров.

            Не, настройки браузеров исключено. Это уже из разряда durty hack.
              Не запускай IE вообще!
              От одного твоего запуска IE умирают 324 птичек колибри от тошноты.
                Цитата JoeUser @
                Не запускай IE вообще!
                От одного твоего запуска IE умирают 324 птичек колибри от тошноты.

                У меня одно из требований поддержка IE последней версии. Не исключено что на нем будут работать. Но тестирую я если что сразу на четрых IE/Edge/FF/Google Chrome. И везде одно и тоже поведение.

                Добавлено
                Все, кажется я решил эту проблему.
                На сервере нужно настроить CORS, например вот так:
                ExpandedWrap disabled
                              app.UseCors(builder =>
                                  builder.WithOrigins("http://localhost:5003").AllowAnyMethod().AllowAnyHeader().AllowCredentials());


                Ajax запросы все, должны быть с заголовками CORS, примерно вот такие:
                ExpandedWrap disabled
                      $.ajax({
                          type: 'GET',
                          url: globalURL + '/api/MyController/ChangeName',
                          beforeSend: function (xhr) {
                              xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
                              xhr.setRequestHeader("Access-Control-Allow-Credentials", "true");
                              xhr.setRequestHeader("Set-Cookie", "true");
                          },
                          contentType: "application/json; charset=utf-8",
                          xhrFields: {
                              withCredentials: true
                          },
                          crossDomain: true
                      })
                      .done(function (response) {
                          writeTrace(container, "Changed Session variable: " + response);
                      });


                Тогда все работает. Ура товагищи, вопгос гешен!
                  Киля, что тут сказать - мои соболезнования :'(
                  От IE уже сам Мелкософт отказался.
                  Надо твоим работодателям вбить гвоздь в голову, обычный, не хромированный.
                    Цитата JoeUser @
                    От IE уже сам Мелкософт отказался.
                    Надо твоим работодателям вбить гвоздь в голову, обычный, не хромированный.

                    Он еще идет в составе Windows Server'ов поэтому никто пока от него не отказался. Вот когда откажутся, так сразу же и перестанем поддерживать IE.

                    Добавлено
                    Вот у меня Windows Server 2016 стоит, и какой на нем браузер по умолчанию, как ты думаешь?
                      Цитата Wound @
                      Тогда все работает. Ура товагищи, вопгос гешен!

                      Поздравлям! :victory:
                      ЗЫ: Но работодателей нужно всеж казнить, ящетаю!

                      Добавлено
                      Цитата Wound @
                      Вот у меня Windows Server 2016 стоит, и какой на нем браузер по умолчанию, как ты думаешь?

                      Без понятия!

                      Знаю одно:
                      Цитата
                      Вместо IE12 Microsoft выпустила новый браузер — Microsoft Edge, включенный в состав Windows 10. Для более ранних версий Windows Edge недоступен. IE 11 доступен в Windows 10 для совместимости.

                      И эта вся шляпа отсюдова.
                        Цитата JoeUser @
                        И эта вся шляпа отсюдова.

                        Оттудова и вот эта шляпа:
                        Цитата

                        Internet Explorer 11 — последняя версия браузера Internet Explorer от Microsoft, преемник Internet Explorer 10. Включен в состав Windows 8.1 и Windows Server 2012 R2, Windows 10 и Windows Server 2016. Пользователи Windows 7 могут установить IE 11 в качестве обновления через центр обновления Windows. Википедия

                        Пока поддержка этих систем осуществляется IE будет жить. :-?
                        Сообщение отредактировано: Wound -
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0347 ]   [ 16 queries used ]   [ Generated: 16.04.24, 22:23 GMT ]