警告:JAXP在Jersey2.x客户端上具有XMLConstants.FEATURE_SECURE_PROCESSING功能

时间:2013-09-22 09:29:08

标签: jersey-client jersey-2.0

2013年9月22日下午5:15:00 org.glassfish.jersey.message.internal.SecureSaxParserFactory

WARNING: JAXP feature XMLConstants.FEATURE_SECURE_PROCESSING cannot be set on a SAXParserFactory. External general entity processing is disabled but other potential security related features will not be enabled.
org.xml.sax.SAXNotRecognizedException: Feature 'http://javax.xml.XMLConstants/feature/secure-processing' is not recognized.
    at org.apache.xerces.parsers.AbstractSAXParser.setFeature(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.setFeatures(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.<init>(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParserImpl(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(Unknown Source)
    at org.glassfish.jersey.message.internal.SecureSaxParserFactory.<init>(SecureSaxParserFactory.java:107)...

我可以用 config.getFeatures().put(FeaturesAndProperties.FEATURE_DISABLE_XML_SECURITY, true);

要在 Jersey1.x 上避免此警告消息,但是当我迁移到 Jersey2.x 时,没有此功能设置。 我怎么能在Jersey2.x上再次避免它呢? 谢谢!

3 个答案:

答案 0 :(得分:3)

  

在JAXP 1.3中,它与Java 1.5捆绑在一起并作为选项提供   在早期版本中,您可以限制所有这些潜在的溢出   设置SAX功能   http://javax.xml.XMLConstants/feature/secure-processing   (XMLConstants.FEATURE_SECURE_PROCESSING)。一旦你设定了那个   功能,任何过长的结构 - 是否太多   元素中的属性或元素名称中的字符太多 -   将被视为良好的形成错误。这意味着你可能会结束   拒绝一些真正完善的文件;但是,默认   值非常大,可以处理大多数现实文档。

在Jersey2.x中,要检查是否禁用此功能: org.glassfish.jersey.message.internal.AbstractXmlFactory boolean isXmlSecurityDisabled(){     返回PropertiesHelper.isProperty(config.getProperty(MessageProperties.XML_SECURITY_DISABLE)); } 我们可以发现Jersey使用MessageProperties.XML_SECURITY_DISABLE参数来检查此设置。

所以,我们可以单独设置它: 服务器:

@ApplicationPath("/*")
public class XXXResourceConfig extends ResourceConfig {
    public XXXResourceConfig() {
        packages("xxx.yyy.zzz");
        property(MessageProperties.XML_SECURITY_DISABLE, Boolean.TRUE);
    }
}

客户端:

ClientConfig config = new ClientConfig();
...
config.property(MessageProperties.XML_SECURITY_DISABLE, Boolean.TRUE);

答案 1 :(得分:1)

feuyeux的代码工作正常。感谢。

JAX-RS客户端代码:

Client client = ClientBuilder.newClient();
client.property(MessageProperties.XML_SECURITY_DISABLE, Boolean.TRUE);
client.target("http://localhost:7101/helloword/rest").path("dummy").request(MediaType.APPLICATION_JSON).get(String.class);

答案 2 :(得分:0)

我确信在这种情况下上述答案非常好。但为了完整起见,我添加了我在调查时发现的内容。根据{{​​3}},xerces的旧版本可能会导致问题。它可以被其他依赖项隐式添加,并且需要在这些情况下被排除。