Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.73.35] |
|
Сообщ.
#1
,
|
|
|
Всем привет.
Есть два приложения: app1, app2 Первое приложение(app1) делает запросы через ajax на котроллер второго(app2). У второго приложения(app2) внутри есть своя HTTP сессия, в которую сохраняются какие то данные. Так вот при повторном обращении к контролеру, данных(которые я уже добавил в сессию в предыдущем вызове) - нет. Есть подозрения что при выполнении ajax из JS, он просто не сохраняет куку, и данные теряются вместе с сессионной кукой. Подробнее: Допустим я делаю ajax запрос: $.ajax({ type: 'POST', url: URL, contentType: "application/json; charset=utf-8", data: JSON.stringify(data), dataType: "json", xhrFields: { withCredentials: true }, crossDomain: true }) }); Попадаю внутрь метода своего API контроллера, в котором пишу: HttpContext.Session.SetString(NameKey, "This is change name variable"); Так вот когда повторно я попадаю в любой метод этого же контроллера из ajax, у меня моя сессия пустая. А я хочу чтоб она содержала мой ключ и значение, которое я сохранил ранее. Добавлено Еще одно уточнение - все это работает, если тестировать на 1 приложении. Т.е. на одном приложении все ajax запросы отрабатывают норм. Как только обращаемся через кросс домен к другому приложению - сессия не сохраняется |
Сообщ.
#2
,
|
|
|
Киля, готового кода или исправления не предоставлю, но постараюсь помочь ...
Вся твоя шляпа в виде фрэймворков зиждется на простом жаба-скрипте. Возьми и задебажь "по-сырому". Для это запили в систему что-то типа WinShark, отлови всю последовательность HTTP-пакетов, ну и зацени на каком этапе "что-то" пошло не так. Если есть два app - проблем нет, просто виртуализируй их на локальном хосте. Ну, и ясный перец, проблем там где вход норм, а выход нет (допустим должен ставить куки, а не ставит). Уверен, что последовательность сырых запросов тебе поможет распознать врага! |
Сообщ.
#3
,
|
|
|
Цитата JoeUser @ Если есть два app - проблем нет, просто виртуализируй их на локальном хосте. Оно и так на одном хосте. обращаюсь к http://localhost:5000/api/Controller/Method. Цитата 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. Вот я не понимаю - это он серьезно, или можно это обойти, чтоб не писать какие то прокси-прокладки? |
Сообщ.
#4
,
|
|
|
Wound, Киля, повторюсь ... не мне тебя учить - иди от лов-левела к хай.
Сперва лови сырое виншарком. Это тебе будет писча для размышлений. А как выловишь непотребство, вот тогда и ищи его в коде. И да ... если код идеален - третьим шагом смари настройки браузеров. Да пребудет с тобой сила! ЗЫ: На IE положи болт! Это говно-браузер, который маст дай. Тести под Хромом или Мазилой. |
Сообщ.
#5
,
|
|
|
Цитата JoeUser @ Wound, Киля, повторюсь ... не мне тебя учить - иди от лов-левела к хай. Сперва лови сырое виншарком. Это тебе будет писча для размышлений. А как выловишь непотребство, вот тогда и ищи его в коде. Да уже сижу в фидлере... Цитата JoeUser @ И да ... если код идеален - третьим шагом смари настройки браузеров. Не, настройки браузеров исключено. Это уже из разряда durty hack. |
Сообщ.
#6
,
|
|
|
Не запускай IE вообще!
От одного твоего запуска IE умирают 324 птичек колибри от тошноты. |
Сообщ.
#7
,
|
|
|
Цитата JoeUser @ Не запускай IE вообще! От одного твоего запуска IE умирают 324 птичек колибри от тошноты. У меня одно из требований поддержка IE последней версии. Не исключено что на нем будут работать. Но тестирую я если что сразу на четрых IE/Edge/FF/Google Chrome. И везде одно и тоже поведение. Добавлено Все, кажется я решил эту проблему. На сервере нужно настроить CORS, например вот так: app.UseCors(builder => builder.WithOrigins("http://localhost:5003").AllowAnyMethod().AllowAnyHeader().AllowCredentials()); Ajax запросы все, должны быть с заголовками CORS, примерно вот такие: $.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); }); Тогда все работает. Ура товагищи, вопгос гешен! |
Сообщ.
#8
,
|
|
|
Киля, что тут сказать - мои соболезнования
От IE уже сам Мелкософт отказался. Надо твоим работодателям вбить гвоздь в голову, обычный, не хромированный. |
Сообщ.
#9
,
|
|
|
Цитата JoeUser @ От IE уже сам Мелкософт отказался. Надо твоим работодателям вбить гвоздь в голову, обычный, не хромированный. Он еще идет в составе Windows Server'ов поэтому никто пока от него не отказался. Вот когда откажутся, так сразу же и перестанем поддерживать IE. Добавлено Вот у меня Windows Server 2016 стоит, и какой на нем браузер по умолчанию, как ты думаешь? |
Сообщ.
#10
,
|
|
|
Цитата Wound @ Тогда все работает. Ура товагищи, вопгос гешен! Поздравлям! ЗЫ: Но работодателей нужно всеж казнить, ящетаю! Добавлено Цитата Wound @ Вот у меня Windows Server 2016 стоит, и какой на нем браузер по умолчанию, как ты думаешь? Без понятия! Знаю одно: Цитата Вместо IE12 Microsoft выпустила новый браузер — Microsoft Edge, включенный в состав Windows 10. Для более ранних версий Windows Edge недоступен. IE 11 доступен в Windows 10 для совместимости. И эта вся шляпа отсюдова. |
Сообщ.
#11
,
|
|
|
Цитата 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 будет жить. |