繁体   English   中英

Java Applet HttpClient AccessControlException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM