当前位置: 首页 > 面试题库 >

Xpath转换在Java中不起作用

黄逸清
2023-03-14
问题内容

这是我的xml文档。我只想使用xml签名对userID部分进行签名。我正在使用xpath转换来选择该特定元素。

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
Version="2.0" IssueInstant="2012-05-22T13:40:52:390" ProtocolBinding="urn:oasis:na
mes:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="localhos
t:8080/consumer.jsp">
<UserID>
   xyz
</UserID>
<testing>
   text
</testing>
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
   http://localhost:8080/saml/SProvider.jsp
</saml:Issuer>
</samlp:AuthnRequest>

我正在使用以下代码添加转换:

transformList.add(exc14nTransform);
 transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"")));

但是我得到以下内容:

Original Exception was javax.xml.transform.TransformerException: Extra illegal t
okens: 'xmlns', ':', 'samlp', '=', '"urn:oasis:names:tc:SAML:2.0:protocol"'

因此,我尝试删除xmlns部分。

transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID")));

但是它在整个文档上签名并给出以下消息:

com.sun.org.apache.xml.internal.security.utils.CachedXPa
thFuncHereAPI fixupFunctionTable
INFO: Registering Here function

问题是什么?
编辑
正如@JörnHorstmann所说,消息只是一条日志或类似的东西。现在的问题是,即使在给xpath查询后,整个文档也会被签名,而不仅仅是UserID。我通过<testing>在签署文档后更改element
的值来确认这一点。结果是该文档未得到验证(如果仅对UserID部分签名,则对它所做的任何更改<testing>都应产生有效的签名。)


问题答案:

这不是有效的xpath表达式,无法在表达式内部声明名称空间前缀。

samlp:AuthnRequest/UserID xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

XPathFilterParameterSpec确实有另一个构造函数,该构造函数允许指定名称空间前缀的映射,您可以尝试以下表达式:

new XPathFilterParameterSpec("samlp:AuthnRequest/UserID",
    Collections.singletonMap("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"))

编辑:

该消息似乎不是错误,请参见此处的第426行,但其日志级别可能应低于INFO。

我也看了一下xpath过滤的描述:

对于输入节点集中的每个节点,将对XPath参数中出现的XPath表达式进行一次评估。结果转换为布尔值。如果布尔值为true,则该节点包含在输出节点集中。如果布尔值为false,则从输出节点集中省略该节点。

因此,仅包含UserID签名中的正确xpath表达式将是self::UserID。但是不要问我,这对于xml签名是否真的有意义。规范中的示例似乎使用xpath表达式来包含除签名元素本身之外的所有内容:

not(ancestor-or-self::dsig:Signature)

编辑2:

正确的表达实际上是ancestor-or-self::UserID因为过滤器还必须包括该节点的文本子UserID节点。



 类似资料:
  • 问题内容: 我试图通过将其旋转10度来变换菜单项。我的CSS在Firefox中可以使用,但是我无法在Chrome和Safari中复制效果。我知道IE不支持CSS3属性,所以这不是问题。 我使用以下CSS: 有人可以建议我要去哪里错吗? 谢谢。 问题答案: 这只是一个有根据的猜测,而没有看到其余的HTML / CSS: 您申请了还是申请了?如果没有,请尝试。 否则,请尝试应用CSS3转换规则。

  • 在我的Android应用程序的Java中,我试图在XML中显示日期和时间,我从API响应中获得“StartDateTime”。以下是详细情况: 这是我从API响应中得到的:

  • 我正在制作一个java刚体物理引擎,到目前为止它做得很好,直到我尝试实现旋转。我不知道问题出在哪里。我有使用这些网站上的公式计算凸多边形和圆的惯性矩的方法: http://lab.polygonal.de/?p=57 http://en.wikipedia.org/wiki/List_of_moments_of_inertia 这是多边形转动惯量的代码: 这是圆形的: 我知道面积函数工作正常,我已

  • 我在这里读到了添加到材料设计库中的新运动过渡https://material.io/develop/android/theming/motion.并想为我的应用程序实现同样的功能。 我的应用是销售产品的电子商务应用。所以我想在点击回收器视图中的产品导航到产品详细信息时实现容器转换。我浏览了很多教程,这些教程主要是在kotlin中,然后在我的java代码中使用,现在从产品列表过渡到详细信息工作,但当

  • 问题内容: 我有一个带有JFrame的Java程序 我正在使用绝对定位 这是我的主要功能 当我运行程序时,我尝试调整其大小并使窗口变小,但我无法 当我尝试使窗口变大时,它可以正常工作,我基本上会跳过该功能 我已经看过了,显然这已经发生过 这是一个已知的错误? 如果是这样,我听说我可以制造一个Window Listener,当我尝试它时,我实现了WindowListener所需的功能,但找不到任何解

  • 我在oracle Docs for java中读到了Thread.interrupted将使线程恢复到non-interprated状态。当线程通过调用静态方法thread.interrupted检查中断时,中断状态将被清除。一个线程用来查询另一个线程的中断状态的非静态isInterrupted方法不会更改中断状态标志。 上面的块根本不被调用。 产出: