加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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而不进行验证

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读