在JAX-WS中隐藏WSDL

时间:2012-08-24 09:20:16

标签: wsdl jax-ws

我使用JAX-WS来构建和部署Web服务。

一切正常,但我需要隐藏WSDL。换句话说,如果用户转到以下URL:http://foo.com/wm-ws/WMService2?wsdl,我不希望WSDL显示。

我读到我们可以使用@WSDL注释,所以我这样做:

@WebService(serviceName = "WMService2",
        targetNamespace = "http://test.wmservice.soap/",
        portName = "WMService2")
@WSDL(exposed = false)

public class WMService2
{
  ...
}

但这并没有改变任何事情...... WSDL仍在展示。我已经看到了创建过滤器的方法,但我认为这是一种过度杀伤。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

对于初学者,您的客户端可能会在运行时需要WSDL。可以通过手工制作的客户端代码或通过包含WSDL的本地副本来解决这个问题(这需要在EE环境中有点神奇,即在工件中打包WSDL并在wsimport中指定wsdl-location (如果需要,我可以提供更多信息;这也是一个有效的解决方案:JAX-WS client : what's the correct path to access the local WSDL?)。这解释了有关依赖性的更多信息,但让它可用于互操作性也是一个好主意:Why is WSDL required for Java Client at runtime?

话虽如此,听起来您实际想要实现的是限制对Web资源的访问,这可以通过web.xml轻松完成。具体来说,您可以添加安全约束

<security-constraint>
    <web-resource-collection>
        <url-pattern>*?wsdl</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

虽然这意味着您必须在容器中设置身份验证并在客户端中进行身份验证(您的容器是什么?客户端?)。 url-pattern可以是任何内容,role-name *表示任何经过身份验证的用户都可以访问该资源。

关于安全约束:http://docs.oracle.com/cd/E19798-01/821-1841/bncbk/index.html