由于要做一个跨浏览器的Applet,经过了安全的数字签名,其中需要使用HTTP请求访问数据。起初使用java.net.URL,后来发现java.net.URL不好用,就换成了Apache的HttpClient。但是发现HttpClient并不会像java.net.URL那样自动使用浏览器设置的代理服务器和Cookie,需要自己使用代码设置代理和Cookie。
那么现在的问题是如何自己取得浏览器的当前使用的代理设置和Cookie。那么首先想到的是从注册表中取,后来发现不可行,因为注册表只有IE才会使用,非IE浏览器(比如Firefox或Netscape)的代理设置并不在注册表中,而且发现还有的客户浏览器的代理设置中设置为自动检测设置或配置为使用自动配置脚本,这样即使分别为每个浏览器设计一套读取代里配置信息的程序,却无法应付这种情况,而java.net.URL却可以很好地处理这种情况。
还有就是类似于Maxthon那样的动态设置代理的浏览器,其中的代理配置只影响Maxthon本身,并不在注册表中,更无法通过读取注册表来进行判断使用的哪个代理服务器。但是java.net.URL却可以很好地使用Maxthon设置的代理。
除了代理服务器外,HttpClient的另一个问题是无法使用浏览器的Cookie。首先我想到的是直接去硬盘上读取,可这又碰到不同浏览器的问题,我无法使用同一个程序读取不同浏览器中的Cookie。另外就是如果通过读取硬盘上的Cookie文件取得Cookie,那么临时Cookie(没有设置过期时间的Cookie,这些Cookie随着浏览器的关闭自动消失)这种不保存在硬盘上的Cookie就无法取到了,而java.net.URL处理不同浏览器之间的Cookie和临时Cookie都做得很好。
由于客户使用的浏览器不同,甚至操作系统也不同(有些是Windows,有些是Linux甚至是Solaris),所以我也不可能罗列出所有的浏览器和所有的操作系统,而分别为HttpClient设置代理和Cookie,而java.net.URL在不同浏览器和不同操作系统中的这两个方面都工作得十分好。不知道有什么办法解决这两个问题吗?

解决方案 »

  1.   

    给你篇文章参考下:
    http://blog.csdn.net/fenglibing/archive/2007/08/14/1742336.aspx
      

  2.   

    你的这个方法试了,发现还是无法完全实现我的目标,因为并不是所有的浏览器都支持javascript的或用户会关闭浏览器的script功能(这两种情况在我的客户群中经常发生)。但即使无法使用script,java.net.URL却可以有效取得不同类型浏览器中不同类型的Cookie(包括临时Cookie),用你说的这种方法却不行……
      

  3.   

    那使用javax.servlet.http.Cookie
    http://blog.csdn.net/WSYXJER/archive/2007/08/09/1733642.aspx
    http://www.blogjava.net/phe441/archive/2007/04/10/109601.html
      

  4.   

    代理服务器参考如下:
    http://www.west263.com/info/html/chengxusheji/Javajishu/20080226/49957.html
    http://doc.linuxpk.com/45872.html
      

  5.   

    使用System.getProperty(“https.proxyHost“)得到代理Host
    System.getProperty(“https.proxyPort“)得到代理Port
      

  6.   

    我个人认为,lz既然可以用java.net.URL解决这两个问题,完全可以将httpClient和java.net.URL一起应用,取长补短嘛。
      

  7.   

    回答之前麻烦自己先试一下可以吗?
    Applet(不管有没有经过安全的数字签名)中无法使用System.getProperty("http.proxyHost")得到浏览器设置的代理Host
    也无法通过System.getProperty("http.proxyPort")得到浏览器设置的代理Port
      

  8.   

    可以用ProxySelectorRoutePlanner获取proxy, 
    参考:http://www.nabble.com/Best-way-to-deal-with-proxy-servers-from-simple-applet--td22129390.htmlDefaultHttpClient httpclient = new DefaultHttpClient();ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
             httpclient.getConnectionManager().getSchemeRegistry(),
             ProxySelector.getDefault());httpclient.setRoutePlanner(routePlanner); 
      

  9.   

    读cookie可以设置http.protocol.single-cookie-header参数为true. 
    参考:http://hc.apache.org/httpclient-3.x/cookies.html
      

  10.   

    好用!
    不过发现这种方法只能在jdk1.5及以上才能用,jdk1.4用不了。
      

  11.   

    这个只是让Cookie多头合并成一个头,并不能取得现有的浏览器Cookie(浏览器不一定支持JavaScript,所以也不能通过Applet调用JavaScript取得Cookie)。
      

  12.   

    代理的问题解决了,Cookie的问题还没有解决……