1

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 上再次避免它?谢谢!

4

3 回答 3

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() { return 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);
于 2013-09-25T04:42:35.467 回答
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);
于 2015-04-14T10:26:41.450 回答
0

我相信在这种情况下,上面的答案真的很好。但是为了完整起见,我添加了我在调查时发现的内容。根据这篇文章,旧版本的xerces可能会导致问题。它可以由其他依赖项隐式添加,在这些情况下需要排除。

于 2016-05-23T11:02:02.537 回答