Scala / Java不尊重w3“多余dtd流量”规格?
发布时间:2020-12-16 09:22:36 所属栏目:安全 来源:网络整理
导读:我是新来的Scala,所以我可能在这个基础上,我想知道问题是否是我的代码.给定Scala文件httpparse,简化为: object Http { import java.io.InputStream; import java.net.URL; def request(urlString:String): (Boolean,InputStream) = try { val url = new URL
我是新来的Scala,所以我可能在这个基础上,我想知道问题是否是我的代码.给定Scala文件httpparse,简化为:
object Http { import java.io.InputStream; import java.net.URL; def request(urlString:String): (Boolean,InputStream) = try { val url = new URL(urlString) val body = url.openStream (true,body) } catch { case ex:Exception => (false,null) } } object HTTPParse extends Application { import scala.xml._; import java.net._; def fetchAndParseURL(URL:String) = { val (true,body) = Http request(URL) val xml = XML.load(body) // <-- Error happens here in .load() method "True" } } 哪个运行(URL不要紧,这是一个笑话的例子): scala> HTTPParse.fetchAndParseURL("http://stackoverflow.com") 结果总是: java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/html4/strict.dtd at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1187) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:973) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEnti... 我已经看到了关于Java的Stack Overflow thread,以及W3C’s System Team Blog entry关于不试图通过网络访问这个DTD.我也将错误隔离到XML.load()方法,这是一个Scala库方法,据我所知. 我的问题:我该如何解决?这是由我的代码(从Raphael Ferreira’s post开始)的一个产品,这是Java特有的东西,我需要在the previous thread处理,或者是Scala具体的东西?这个电话发生在哪里,是一个bug还是一个功能? (“是我吗?是她,对吗?”) 解决方法
我碰到了同样的问题,我没有找到一个优雅的解决方案(我正在考虑将问题发布到Scala邮件列表)同时,我发现了一个解决方法:实现你自己的SAXParserFactoryImpl,所以你可以设置f .setFeature(“
http://apache.org/xml/features/disallow-doctype-decl”,true);属性.好的是,它不需要对Scala代码库进行任何代码更改(我同意它应该是固定的).
首先我扩展了默认解析器工厂: package mypackage; public class MyXMLParserFactory extends SAXParserFactoryImpl { public MyXMLParserFactory() throws SAXNotRecognizedException,SAXNotSupportedException,ParserConfigurationException { super(); super.setFeature("http://xml.org/sax/features/validation",false); super.setFeature("http://apache.org/xml/features/disallow-doctype-decl",false); super.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar",false); super.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false); } } 没什么特别的,我只想有机会设置财产. (注意:这是简单的Java代码,大概你可以在Scala中写同一个) 在Scala代码中,您需要配置JVM以使用新的工厂: System.setProperty("javax.xml.parsers.SAXParserFactory","mypackage.MyXMLParserFactory"); 那么你可以调用XML.load而不进行验证 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |