EntityResolver解析

spring解析XML,SAX首先读取该XML文件上的声明,根据声明去寻找相应的DTD定义,以便对文档做验证。默认的寻找规则是通过网络(声明的DTD的URL地址)来下载相应的DTD声明,并进行验证。由于出于网络的原因,spring提供了一个自定义寻找DTD/XSD声明的方式。

spring解析XML的代码:

protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception {
   return this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler,
         getValidationModeForResource(resource), isNamespaceAware());
}
public interface EntityResolver {
    InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException;
}

spring使用DelegatingEntityResolver实现类来解析XML的自定义声明

public InputSource resolveEntity(@Nullable String publicId, @Nullable String systemId)
      throws SAXException, IOException {

   if (systemId != null) {
      if (systemId.endsWith(DTD_SUFFIX)) {
         return this.dtdResolver.resolveEntity(publicId, systemId);
      }
      else if (systemId.endsWith(XSD_SUFFIX)) {
         return this.schemaResolver.resolveEntity(publicId, systemId);
      }
   }

   // Fall back to the parser's default behavior.
   return null;
}

一、读取XSD

EntityResolver解析

参数值:

publicId=null

systemId=http://www.springframework.org/schema/beans/spring-beans.xsd

加载机制是在META-INF/Spring.schemas文件中systemId对应的xsd

EntityResolver解析

二、读取DTD

 EntityResolver解析

 参数:

publicId=- // Spring //DTD  BEAN  2.0 // EN

systemId=http: // www.springframework.org/dtd/Spring-beans-2.0.dtd

加载机制是截取systemId的Spring-beans-2.0.dtd取当前路径下寻找

EntityResolver解析

上一篇:常见web漏洞------XXE


下一篇:JavaWeb——XML