Java实现Web版RSS阅读器(四)定制自己的Rss解析库myrsslib4j2014-11-05 csdn博客 龙轩在上篇博文《Web版RSS阅读器(三)——解析在线Rss订阅》中,已经提到了遇到的问题,这里再详细说一下。在解析rss格式的订阅时,遇到的最主要的问题是,出现了“Server returned HTTP response code: 403 for URL: http://xxxxxx”的错误,百度一下就知道,这是在网站访问中很常见的一个错误,服务器理解客户的请求,但拒绝处理它。即拒绝访问!接着查资料,得知某些服务器(比如CSDN博客)拒绝java作为客户端进行对其的访问,所以在解析时,会抛异常。不让访问怎么办,别怕,我们上有政策,下有对策。通过设置User-Agent来欺骗服务器,从而访问服务器。connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //用UA伪装访问连接对象但是折腾了半天,发现只有修改rsslib4j.jar才能给连接对象设置UA。只好找源码修改一下了,N久之后,在Google Code上猎取到一个开源的项目newrsslib4j,它是在rsslib4j的基础上修改而来的,项目开源主页:http://code.google.com/p/newrsslib4j/。满怀欣喜的下载下来,结果发现,依旧有403的问题。一狠心,自己来做一个rsslib,然后就checkout了newrsslib4j的源码,自己动手改动。1. 修改403 forbidden问题。修改org.gnu.stealthp.rsslib包中的RssParser类的setXmlResource()方法,给URLConnection对象,添加UA。
/*** Set rss resource by URL* @param ur the remote url* @throws RSSException*/public void setXmlResource(URL ur) throws RSSException{try{URLConnection con = u.openConnection();//-----------------------------//添加时间:2013-08-14 21:00:17//人员:@龙轩//博客:http://blog.csdn.net/xiaoxian8023//添加内容:由于服务器屏蔽java作为客户端访问rss,所以设置User-Agentcon.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");//-----------------------------con.setReadTimeout(10000); String charset = Charset.guess(ur); is = new InputSource (new UnicodeReader(con.getInputStream(),charset));if (con.getContentLength() == -1 && is == null){this.fixZeroLength();}}catch(IOException e){throw new RSSException("RSSParser::setXmlResource fails: "+e.getMessage());}}修改org.mozilla.intl.chardet包中的Charset类的guess()方法,注释掉原来的InputStream对象,创建URLConnection,设置User-Agent,通过URLConnection对象创建InputStream :
//judge from urlpublic static String guess(URL url) throws IOException {//-----------------------------//修改时间:2013-08-14 21:00:17//人员:@龙轩//博客:http://blog.csdn.net/xiaoxian8023//修改内容:注释InputStream,创建URLConnection,设置User-Agent,通过URLConnection对象创建InputStream//InputStream in = url.openStream();URLConnection con = url.openConnection();con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");InputStream in = con.getInputStream();//-----------------------------return guess(in);}更多精彩内容:http://www.bianceng.cn/Programming/Java/