java的URLConnection失败

import java.util.*;
import java.io.*;
import java.net.*;
public class Connect{
        public static void main(String[] args){  
                try{            
                      URLConnection conn = new URL("http://www.baidu.com").openConnection();
                      conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows XP; DigExt)");                                     
                      System.out.println("OK,Connect successfully");               
                }catch(Exception e){
                        System.out.println(e);
                }
        }
}

这几天想了一个项目,将自己的博客里leetcode文章提取出来然后自动生成一个文档,这样方便自己转成pdf离线看。

首先是自己手动链接到blog.csdn,net,然后第一步就碰到问题了。

当访问百度或者csdn的首页时能正常访问,然后访问博客文章九提示错误:

java.io.IOException: Server returned HTTP response code: 403 for URL: http://blog.csdn.net

经过百度得知原因是(http://blog.sina.com.cn/s/blog_4b6f8d1501017a5l.html):

因为服务器的安全设置不接受Java程序作为客户端访问,解决方案是设置客户端的User Agent。

虽然解决了,接下来看看那句话是什么意思?

一、URLConnection:

抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:

  1. 通过在 URL 上调用 openConnection 方法创建连接对象。
  2. 处理设置参数和一般请求属性。
  3. 使用 connect 方法建立到远程对象的实际连接。
  4. 远程对象变为可用。远程对象的头字段和内容变为可访问。

使用以下方法修改设置参数:

  • setAllowUserInteraction
  • setDoInput
  • setDoOutput
  • setIfModifiedSince
  • setUseCaches

使用以下方法修改一般请求属性:

  • setRequestProperty

上面每个 set 方法都有一个用于获取参数值或一般请求属性值的对应 get 方法。适用的具体参数和一般请求属性取决于协议。

在建立到远程对象的连接后,以下方法用于访问头字段和内容:

  • getContent
  • getHeaderField
  • getInputStream
  • getOutputStream

某些头字段需要经常访问。以下方法:

  • getContentEncoding
  • getContentLength
  • getContentType
  • getDate
  • getExpiration
  • getLastModifed

setRequestProperty

public void setRequestProperty(String key,
                               String value)
设置一般请求属性。如果已存在具有该关键字的属性,则用新值改写其值。

注:HTTP 要求所有能够合法拥有多个具有相同键的实例的请求属性,使用以逗号分隔的列表语法,这样可实现将多个属性添加到一个属性中。

参数:
key - 用于识别请求的关键字(例如," accept")。
value - 与该键关联的值。
User-Agent头域的内容包含发出请求的用户信息
参考: HTTP头部详解


你可能感兴趣的:(java,Web,url)