URLs,URIs,Proxies和Passwords 解析[9]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

import java.net.*;
import java.util.*;
import java.io.*;

public class LocalProxySelector extends ProxySelector {
  
  private List failed = new ArrayList( );
  
  public List<Proxy> select(URI uri) {
    
    List<Proxy> result = new ArrayList<Proxy>( );
    if (failed.contains(uri)
      || "http".equalsIgnoreCase(uri.getScheme( ))) {
        result.add(Proxy.NO_PROXY);
    }
    else {
        SocketAddress proxyAddress
          = new InetSocketAddress( "proxy.example.com", 8000);
        Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddress);
        result.add(proxy);
    }
    
    return result;
    
  }
  
  public void connectFailed(URI uri, SocketAddress address, IOException ex) {
    failed.add(uri);
  }
  
}



我已经说过的,每个运行的jvm都肯定会有一个ProxySelector 。为了改变这个ProxySelector ,我们给静态方法ProxySelector.setDefault( )  传一个新的选择器,像这样:

ProxySelector selector = new LocalProxySelector( ):
ProxySelector.setDefault(selector);



从这以后,这个jvm打开的所有连接都会询问这个ProxySelector 该使用哪个合适的代理。正常情况下,你不要在共享环境中使用这段代码。例如,在一个servlet中,你就不要去改变这个ProxySelector 了,因为对在相同容器中的所有servlet来说,它们的ProxySelector 也都被改变了。

通过GET与服务器端程序进行交互

类URL 使java applet和application与服务器端程序比如CGIs, servlets, PHP页面,和其他使用GET 方法程序的交互,变得更容易了。(我们将在15章讨论服务器端使用POST 方法会用到URLConnection 类的程序。)所有你需要知道的是程序希望接受名字和值之间采取怎样的连接,生成一个带有查询string的URL,这个string会提供正需要的名字和值。所有的名字和值必须是这样x-www-form-url-encoded—被方法URLEncoder.encode()  编码的,这在前面已经讨论过了。

对一个特定程序的查询string,这里有许多方法来决定它的语法规则。如果你自己已经写过服务器端程序,那么你就已经知道了满足这种程序的名字和值对。如果你已经在自己的服务器上安装了第三方的程序,这个程序的说明文档会告诉你它需要什么样的名字和值对。另一方面,如果你正在与第三方服务器上的程序进行对话,可能就得麻烦多了。你可以总是问在远程服务器上的管理员,让他给你提供怎样和他的站点进行对话的规范说明。尽管如此,即使他们不介意这样做,恐怕也没有谁的工作就是“告诉与我们没有任何关系的黑客,怎样才能进入我们的服务器。”因此,除非你恰巧碰到一个特别热心的或者一个无聊的人,他除了写一封长长的email邮件来告诉你如何进入他们的服务器以外,就没有什么其他事干,否则的话,你不得不做一些逆向工程。

注意:  这种情况正在得到改变。不少的网站开始认识到对第三方开发人员开放他们系统的重要性,以及发布一些开发人员需要的插件的重要性。这些插件提供了详细的信息,利用这些信息来构造URL,对他们网站上的服务进行访问。像站点Safari 和 Amazon都提供了RESTful, URL-based接口,通过URL 类,它们都很容易被访问。像eBay和 Google的 SOAP-based服务就很难使用了。

许多程序被设计用来处理表格输入,如果真是这种情况,就可以直截了当地指出程序需要的是什么输入就行了。表格使用的方法应该是FORM 元素的METHOD 属性的值。这个值要么是GET ,这时你可以使用这里所说的这种处理流程,要么是POST ,这时你可以使用将在15章讲的处理流程。FORM 元素的ACTION 属性的值给出了URL查询string前面的内容。需要注意这可能是个相对URL,这时你应该找到与之相对应的绝对URL。最后,名字和值对(name-value pairs)就是INPUT 元素的NAME 属性,TYPE 属性的值是submit的INPUT 元素例外。

比如,看一下我的Cafe con Leche站点上用于本地搜索引擎的HTML表格。你可以看见它使用了GET 方法。通过URL http://www.google.com/search ,这个处理表格的程序能被访问。它有四对名字和值对,它们中的三个有默认值:

<form name="search" action="http://www.google.com/search" method="get">
  <input name="q" />
  <input type="hidden" value="cafeconleche.org" name="domains" />
  <input type="hidden" name="sitesearch" value="cafeconleche.org" />
  <input type="hidden" name="sitesearch2" value="cafeconleche.org" />
   <br />
   <input type="image" height="22" width="55"
      src="images/search_blue.gif" alt="search" border="0"
      name="search-image" />
</form>



INPUT 的类型并不重要——例如,它是一个复选框的集合,一个下拉菜单条,或者是一个文本域都不重要——只有你给的每个INPUT 的名字和值才是重要的。只有submit型的input是个例外,它告知web浏览器什么时候发送数据,但不会给出服务器任何其他信息。在一些情况下,你可能会发现hidden型的INPUT 必须有一个特定的要求的默认值。这个表格有三个hidden型的INPUT 。在一些情形下,正在与你对话的程序不可能处理有歧义的文本型的string输入值。尽管如此,因为表格是拿来给大家看和填写的,所以它应该提供足够的线索来提示它需要得到什么样的输入;比如,某个域应该是一个两个字母的缩写或者是一个电话号码。

本文关键:URLs,URIs,Proxies和Passwords 解析
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top