Очевидно, такая схема повышает все виды проблем безопасности. Java имеет строгую концепцию безопасности, но это не тривиально. Возможность завинчивания его и разрешения непривилегированному пользовательскому доступу жизненные компоненты системы не должна быть пропущена.
то, Что, предупреждая в стороне, если Вы берете ввод данных пользователем в форме исходного кода, первая вещь, необходимо сделать, скомпилировать его в байт-код Java. AFIAK, это не может быть сделано исходно, таким образом, необходимо будет сделать системный вызов javac и скомпилировать исходный код в байт-код на диске. Вот учебное руководство, которое может использоваться в качестве начальной точки для этого. Редактирование : как я узнал в комментариях, на самом деле можно скомпилировать код Java из источника исходно с помощью javax.tools. JavaCompiler
, После того как у Вас есть байт-код JVM, можно загрузить его в JVM с помощью ClassLoader функция defineClass. Для установки контекста защиты для этого загруженного класса, необходимо будет указать ProtectionDomain. Минимальный конструктор для ProtectionDomain требует и CodeSource и PermissionCollection. PermissionCollection является объектом основного использования Вам здесь - можно использовать его для определения точных полномочий, которые имеет загруженный класс. Эти полномочия должны быть в конечном счете осуществлены JVM AccessController.
существует много возможных точек ошибки здесь, и необходимо чрезвычайно стараться полностью понять все перед реализацией чего-либо.
Как вы, возможно, уже знаете, общая ошибка может быть зафиксирована методом 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);
}
}
}
Вы можете установить синхронное соединение, позвонив:
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
Ваш поток будет заблокирован до тех пор, пока сделан запрос.
Мне нужно было решение, в котором тоже не использовался делегат, поэтому я взял фрагменты кода, показанные в других ответах здесь, и создал простой метод, который хорошо работает в моем случае (и, возможно, это то, что вы тоже ищете) :
-(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;
}