[英]Java applet AccessControlException (apache httpclient)
[英]Java applet HttpClient AccessControlException
我创建了一个使用Apache HTTP Components中的HttpClient的applet。 该小程序应该打开一个远程网页,并将页面源打印到控制台。 从IDE(NetBeans)运行时,该代码可以正常工作,但是当部署在网页中时,它将引发AccessControlException:
access denied ("java.net.SocketPermission" "www.hardwarebase.net" "resolve")
阅读有关该问题的类似问题后,问题似乎出在小程序未签名的情况下。 我对它进行了自签名,因此当我下次运行它时,该applet要求获得许可。
不过,我也有同样的例外。 这是主要applet类的代码:
public class MyApplet extends java.applet.Applet {
public DefaultHttpClient client;
public String useragent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1";
public void init()
{
resize(150,25);
client = new DefaultHttpClient();
String page = Get("http://www.hardwarebase.net"));
System.out.println(page);
}
public String Get(String url)
{
final HttpUriRequest request = new HttpGet(url);
request.setHeader("User-Agent", useragent);
HttpResponse response;
try {
response = (HttpResponse)AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
try {
return client.execute(request);
} catch (IOException ex) {
Logger.getLogger(MyApplet.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
);
return _getResponseBody(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
public String Post(String url, List<NameValuePair> nameValuePairs)
{
final HttpPost request = new HttpPost(url);
request.setHeader("User-Agent", useragent);
try {
request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response;
try {
response = (HttpResponse)AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
try {
return client.execute(request);
} catch (IOException ex) {
Logger.getLogger(MyApplet.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
);
return _getResponseBody(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
public void paint(Graphics g)
{
g.drawString("Hello world!", 50, 25);
}
public String _getResponseBody(final HttpEntity entity) throws IOException, ParseException
{
if (entity == null) { throw new IllegalArgumentException("HTTP entity may not be null"); }
InputStream instream = entity.getContent();
if (instream == null) { return ""; }
if (entity.getContentLength() > Integer.MAX_VALUE) { throw new IllegalArgumentException("HTTP entity too large to be buffered in memory"); }
String charset = getContentCharSet(entity);
if (charset == null) { charset = HTTP.DEFAULT_CONTENT_CHARSET; }
Reader reader = new InputStreamReader(instream, charset);
StringBuilder buffer = new StringBuilder();
try
{
char[] tmp = new char[1024];
int l;
while ((l = reader.read(tmp)) != -1)
{
buffer.append(tmp, 0, l);
}
}
finally
{
reader.close();
}
return buffer.toString();
}
public String getContentCharSet(final HttpEntity entity) throws ParseException
{
if (entity == null) { throw new IllegalArgumentException("HTTP entity may not be null"); }
String charset = null;
if (entity.getContentType() != null)
{
HeaderElement values[] = entity.getContentType().getElements();
if (values.length > 0)
{
NameValuePair param = values[0].getParameterByName("charset");
if (param != null) { charset = param.getValue(); }
}
}
return charset;
}
}
如何解决此AccessControlException?
我已经通过从HttpClient切换到URLConnection解决了该问题。 我不确定URLConnection为什么不抛出异常,而HttpClient却抛出异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.