powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / XmlHttpRequest && HTTP 302
15 сообщений из 15, страница 1 из 1
XmlHttpRequest && HTTP 302
    #37040069
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сие не ловится . Люди подсказали, что можно подкрутить сервер, чтобы в этом случае происходил редирект на страницу с HTTP 403. Честно говоря, никогда такими вещами не заморачивался. Как это можно сделать? И как в этом случае различать запросы со страниц (в этом случае пусть 302 с redirect'ом пусть остается) и XHR запросы (для которых и нужно вернуть 403)?
_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040076
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft,

Какие такие люди сказали? Можно поимённо?
Имхо, не ловится. Какой нафиг редирект из-под аякса? Страница-то у Вас уже загружена. Как Вы её из-под сервера перезагрузить желаете? Какие-то фантастические вещи говорите и смущаете неокрепшие умы. :)
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040236
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft,

А что в итоге нужно-то? Делал по ошибке запроса сервиса (AJAX) редирект через location.href. Работает.
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040263
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst...Делал по ошибке запроса сервиса (AJAX) редирект через location.href. Работает.
Ну да.
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040290
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeКакие такие люди сказали? Можно поимённо?

Condor
CondorYou'll have to configure your server to redirect to a page with, e.g. a 403 HTTP status. (401 would be more appropriate, but Firefox incorrectly responds to that by showing the basic login dialog).

ShSergeИмхо, не ловится
Дык кто ж спорит-то? ;)
ShSergeКакой нафиг редирект из-под аякса? Страница-то у Вас уже загружена. Как Вы её из-под сервера перезагрузить желаете?
Вы не поняли. Смотрите: когда после протухания сессионной куки делается XHR-запрос, то, хоть и HTTP 302 в XHR.status 200 со всеми вытекающими. Насколько я понял, предлагается 302 заменить на 403 и тогда это уже можно будет отловить на клиенте и сделать соответствующие выводы.
iConstА что в итоге нужно-то?
Все как всегда. ExtJS'ное приложение + юзвера полюбляющие курить/пить кофе/болтать (нужное подчеркнуть)
iConstДелал по ошибке запроса сервиса (AJAX)
Ключевое слово: по ошибке . А при 302 - ошибки не возникает . Соответственно, ExtJS, ничего не ведая, пытается про'eval'ить XHR.responseText, а там, вместо JSON'а, HTML Login'овской страницы и все, ессесно, падает.
iConstредирект через location.href. Работает.
Не сомневаюсь. BTW, с ExtJS'овскими store'ми, в Ext.data.HttpProxy в этом случае, таки, ловиться exception и там, как раз, и можно предпринять location.href. А, вот, XHR - втихушку...
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040323
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft...
Ключевое слово: по ошибке . А при 302 - ошибки не возникает . Соответственно, ExtJS, ничего не ведая, пытается про'eval'ить XHR.responseText, а там, вместо JSON'а, HTML Login'овской страницы и все, ессесно, падает.Ну что на это сказать: Ошибка таки есть - ведь что-то "падает", значит можно это курить.
Что запрашивается, страница? Я для аджакса давно применяю сервисы - не хэндлеры, не страницы, а именно сервисы. Про такие проблемы забыл.
Решения на вскидку:
1) Вынести "сервис" из "закрытой зоны" - проверять в нем аутентификацию и, либо возвращать данные, либо флаг, по которому редиректим на логон.
2) Периодически, нпр. в 5 мин, дергаем сервис (не гуд, но как посмотреть).
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040332
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConstОшибка таки есть - ведь что-то "падает", значит можно это курить.
Согласен. Но это - ошибка . Именно обычная JS'овская ошибка, возникающая в недрах ext-all.js. Даже не exception.
iConstЧто запрашивается, страница?

нЭт. Идет просто обмен данными.
iConstЯ для аджакса давно применяю сервисы - не хэндлеры, не страницы, а именно сервисы. Про такие проблемы забыл.

Это выходит за рамки топика
iConst1) Вынести "сервис" из "закрытой зоны" - проверять в нем аутентификацию и, либо возвращать данные, либо флаг, по которому редиректим на логон.

Не... Если бы это был один обработчик... А так... Сторожа, которые сторожат сторожей?..
iConst2) Периодически, нпр. в 5 мин, дергаем сервис (не гуд, но как посмотреть).
9955888
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040373
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft...
нЭт. Идет просто обмен данными.
...
Не... Если бы это был один обработчик... А так... Сторожа, которые сторожат сторожей?..
...ИМХО, у Вас с архитектурой того... не того :)
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040389
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConstИМХО, у Вас с архитектурой того... не того :)
Это тоже выходит за рамки топика
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040405
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst...Я для аджакса давно применяю сервисы - не хэндлеры, не страницы, а именно сервисы...
Пардон за оффтоп, а можно на эту тему что-то поконкретнее, или тынц какой?
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040491
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
off
ShSergeа можно на эту тему что-то поконкретнее, или тынц какой?

9455139 пойдет?
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37040540
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. Точно. Помню что-то такое уже было. TNX.
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37041468
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, в контексте ExtJS'а, ничего умнее не придумал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
	if ((Context.User == null || !Context.User.Identity.IsAuthenticated)
		&& Context.Request.Headers["X-Requested-With"] != null
		&& Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
	{
		Context.Response.StatusCode =  403 ;
		Context.Response.End();
	}
}
Мо кто-то предложит менее кривое решение?..
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37588633
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_SoftВ общем, в контексте ExtJS'а, ничего умнее не придумал:
Код: sql
1.
Context.Response.StatusCode = 403;



В контекcте ExtJS... почему 403(Forbidden), а не 401 (Unauthorized)?
...
Рейтинг: 0 / 0
XmlHttpRequest && HTTP 302
    #37588819
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман Дынник,
401... нельзя, так как запрос со статусом 401 проходя через конвеер ASP.NET попадает на Security Module и тот заново в таком случае выставляет status = 302.

Решил проблему следующим образом:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        protected void Application_PreSendRequestContent(object sender, EventArgs e) { 
            if (Context.Response.StatusCode == 302)
            {
                Context.Response.ClearContent();
                Context.Response.ClearHeaders();
                //значение 600 - за рамками стандарта и является значением определенным пользователем
                Context.Response.StatusCode = 600;
                string data = @"{success: false, data: [{redirectUrl: 'index.html', Message: 'Session expired or not authorized request'}]}";
                Context.Response.Write(data);
                Context.Response.End();
            }
        }



Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Ext.util.Observable.observe(Ext.data.Connection);
Ext.Ajax.on('requestexception', function (dataconn, response, options) {
    if (response.responseText != null) {
        var resp = Ext.decode(response.responseText);
        Ext.Msg.show({
            title: 'Ошибка',
            msg: resp.data[0].Message,
            buttons: Ext.Msg.OK,
            icon: Ext.window.MessageBox.INFO
        });
    }
});



При этом, у меня ExtJS UI общается с Restful WCF-сервисами и для них реализован FaultErrorHandler и контракт сообщений об ошибке FaultMessage.
В этом случае любой FaultException придет в ожидаемом ExtJS UI виде и для него можно будет использовать общий обработчик requestexception представленный выше.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 public class FaultErrorHandler : IErrorHandler {

        public bool HandleError(Exception error) {
            return true;
        }
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault) {
            // extract the our FaultContract object from the exception object.
            //var detail = FaultMessage.CreateFaultMessage(error);
            var detail = new ExceptionDetail(error);
            // create a fault message containing our FaultContract object
            fault = Message.CreateMessage(version, "", detail, new DataContractJsonSerializer(typeof(ExceptionDetail)));
            // tell WCF to use JSON encoding rather than default XML
            var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
            fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
            HttpResponseMessageProperty property;
            property = new HttpResponseMessageProperty();
            fault.Properties.Add(HttpResponseMessageProperty.Name, property);
            property.Headers.Add("jsonerror", "true");
            property.StatusCode = System.Net.HttpStatusCode.InternalServerError;

        }
    }



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
[DataContract]
    public class FaultMessage {
        [DataMember(Name = "success")]
        public Boolean Success = false;
        [DataMember(Name = "data")]
        public IList<ExceptionDetail> Data { private set; get; }
        private FaultMessage() {
            this.Data = new List<ExceptionDetail>();
        }
        public static FaultMessage CreateFaultMessage(Exception exception) {
            FaultMessage result = new FaultMessage();
            result.Data.Add(new ExceptionDetail(exception));
            return result;
        }
    }

    [DataContract]
    [Serializable]
    public class ExceptionDetail {
        public ExceptionDetail(Exception exception) {
            if (exception.InnerException!=null) {
                exception = exception.InnerException;
            }
            this.Message = exception.Message;
            this.Type = exception.GetType().ToString();
        }
        [DataMember(Order = 1)]
        public string Message { get; private set; }
        [DataMember(Order = 2)]
        public string Type { get; private set; }
    }
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / XmlHttpRequest && HTTP 302
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]