前面提到过要实现java安全跨域请求并交换数据的问题,这一篇博客我们就一起学习一下如何跨域访问资源并返回数据的问题。
要实现跨域请求需要用到java的api,java.net.URL 和 java.net.URLConnection,先来简单的了解一下java的这两个常用与网络编程的api。
java.net.URL:
认识IP、认识URL是进行网络编程的第一步。java.net.URL提供了丰富的URL构建方式,并可以通过java.net.URL来获取资源。
类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
简单的可以把URL理解为包含:协议、主机名、端口、路径、查询字符串和参数等对象。每一段可以独立设置。
应用程序也可以指定一个“相对 URL”,它只包含到达相对于另一个 URL 的资源的足够信息。HTML 页面中经常使用相对 URL。
相对 URL 不需要指定 URL 的所有组成部分。如果缺少协议、主机名称或端口号,这些值将从完整指定的 URL 中继承。
由于 URL 不懂 URL 转义,所以它不会识别同一 URL 的对等编码和解码形式。
注意,URI 类在某些特定情况下对其组成字段执行转义。建议使用 URI 管理 URL 的编码和解码,并使用 toURI() 和 URI.toURL() 实现这两个类之间的转换。也可以使用 URLEncoder 和 URLDecoder 类,但是只适用于 HTML 形式的编码,它与 RFC2396 中定义的编码机制不同。(以上介绍来自Java API doc)
java.net.URLConnection:
URLConnection类是一个抽象类,是实现应用程序和URL之间通信连接的所有类的超类,该类的实例可以用来读写URL所指的资源。在创建了URL对象之后,可以使用该URL对象的openConnection方法来创建URLConnection对象,之后就可以使用下面的方法完成各种各样的操作。
<span style="font-size:18px;">abstract public void connect() throws IOException //打开与URL所指定资源的一个通信连接,如果调用该方法时连接已经打开,则忽略该调用。 public URL getURL() //得到URLConnection对象的URL域。 public int getContentLength() //得到content-type头域的值。 public String getContentEncoding() //得到content-encoding头域的值。 public long getDate() //得到date头域的值。 public long getLastModified() //得到last-modified头域的值。 public String getHeaderField(String name) //得到指定头域的名称。 public Object getContent() throws IOException //得到URL连接的内容。该方法会先调用getContentType方法得到对象的内容类型,再做相应的处理。 public InputStream getInputStream() throws IOException public OutputStream getOutputStream()throws IOException //得到URLConnection的输入或输出流。 public void setDoInput(Boolean doinput) //设置URLConnection对象的doInput域的值。一个URL连接可以用于输入和(或)输出,如果准备将该URLConnection用于读取,可///以设置DoInput标志为true。默认即为true。 public Boolean getDoInput() //得到DoInput标志的值。 public void setDoOutput(Boolean dooutput) //如果想通过URLConnection像服务端写东西,则设置为true,默认为false public Boolean getDoOutput() //设置或得到doOutput标志的值。 public void setAllowUserInteracion(Boolean allowuserinteraction) public Boolean getAllowUserInteraction() //设置或得到allowUserInteraction域的值。 public void setUseCaches(Boolean usecaches) public Boolean getUseCaches() //设置或得到useCaches域的值。 public void setIfModifiedSince(long ifmodifiedsince) public long getIfModifiedSince() //设置或得到ifModifiedSince域的值。 public void setRequestProperty(String key,String value) public String getRequestProperty(String key) //设置或得到普通的请求属性的值。Key为请求的关键字,例如:“accept”,value为与key相对应的值。 </span>★注意:
如果需要使用setDoOutput和setUseCaches等方法设置各种选项,必须是在URLConnection对象创建之后和连接之前。
下面是一个测试实例:
<span style="font-size:18px;">import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.util.Map; import java.util.Set; /** * @version V1.0 * @date: 2013-11-20 上午11:09:51 */ public class Test { public static String getDataFromURL(String strURL, Map<String, Object> param) throws Exception { URL url = new URL(strURL); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); final StringBuilder sb; if (param != null) { sb = new StringBuilder(param.size() << 4);// 4次方 final Set<String> keys = param.keySet(); for (final String key : keys) { final Object value = param.get(key); sb.append(key); // 不能包含特殊字符 sb.append('='); sb.append(value); sb.append('&'); } // 将最后的 '&' 去掉 sb.deleteCharAt(sb.length() - 1); }else{ sb = new StringBuilder(100 << 4); } // writer.write("email=fd3589@163.com&password=123"); writer.write(sb.toString()); writer.flush(); writer.close(); InputStreamReader reder = new InputStreamReader(conn.getInputStream(), "utf-8"); BufferedReader breader = new BufferedReader(reder); BufferedWriter w = new BufferedWriter(new FileWriter("d:/1.txt"));//获取内容输出到指定文件 String content = null; String result = null; while ((content = breader.readLine()) != null) { result += content; } w.write(result); w.flush(); w.close(); return result; } public static void main(String[] args) { String strURL = "http://www.baidu.com"; try { String result = getDataFromURL(strURL, null); System.out.println(result);//输出获取到的内容,测试用 } catch (Exception e) { e.printStackTrace(); } } }</span>
源代码下载:
http://download.csdn.net/detail/smszhuang168/6700711
转载:http://blog.163.com/lfsyhuangaigang@126/blog/static/7743667020131030102442477/