Проверьте, возвращается ли NSURL 404

Очевидно, такая схема повышает все виды проблем безопасности. Java имеет строгую концепцию безопасности, но это не тривиально. Возможность завинчивания его и разрешения непривилегированному пользовательскому доступу жизненные компоненты системы не должна быть пропущена.

то, Что, предупреждая в стороне, если Вы берете ввод данных пользователем в форме исходного кода, первая вещь, необходимо сделать, скомпилировать его в байт-код Java. AFIAK, это не может быть сделано исходно, таким образом, необходимо будет сделать системный вызов javac и скомпилировать исходный код в байт-код на диске. Вот учебное руководство, которое может использоваться в качестве начальной точки для этого. Редактирование : как я узнал в комментариях, на самом деле можно скомпилировать код Java из источника исходно с помощью javax.tools. JavaCompiler

, После того как у Вас есть байт-код JVM, можно загрузить его в JVM с помощью ClassLoader функция defineClass. Для установки контекста защиты для этого загруженного класса, необходимо будет указать ProtectionDomain. Минимальный конструктор для ProtectionDomain требует и CodeSource и PermissionCollection. PermissionCollection является объектом основного использования Вам здесь - можно использовать его для определения точных полномочий, которые имеет загруженный класс. Эти полномочия должны быть в конечном счете осуществлены JVM AccessController.

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

20
задан Gilles 'SO- stop being evil' 6 May 2013 в 14:16
поделиться

3 ответа

Как вы, возможно, уже знаете, общая ошибка может быть зафиксирована методом didFailWithError:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}

, но для 404 «Not Found» или 500 «Internal Server Error» должна иметь возможность захвата внутри метода didReceiveResponse:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response respondsToSelector:@selector(statusCode)])
    {
        int statusCode = [((NSHTTPURLResponse *)response) statusCode];
        if (statusCode == 404)
        {
            [connection cancel];  // stop connecting; no more delegate messages
            NSLog(@"didReceiveResponse statusCode with %i", statusCode);
        }
    }
}
39
ответ дан 29 November 2019 в 22:34
поделиться

Вы можете установить синхронное соединение, позвонив:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Ваш поток будет заблокирован до тех пор, пока сделан запрос.

2
ответ дан 29 November 2019 в 22:34
поделиться

Мне нужно было решение, в котором тоже не использовался делегат, поэтому я взял фрагменты кода, показанные в других ответах здесь, и создал простой метод, который хорошо работает в моем случае (и, возможно, это то, что вы тоже ищете) :

    -(BOOL) webFileExists {

        NSString *url = @"http://www.apple.com/somefile.html";

        NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
        NSHTTPURLResponse* response = nil;
        NSError* error = nil;
        [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        NSLog(@"statusCode = %d", [response statusCode]);

        if ([response statusCode] == 404)
            return NO;
        else
            return YES;
     }
29
ответ дан 29 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: