1

我正在使用 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 仍在显示。我见过创建过滤器的解决方法,但我认为这是一种矫枉过正的做法。

有任何想法吗?

4

1 回答 1

2

对于初学者,您的客户端可能会在运行时需要 WSDL。可以使用手工制作的客户端代码或包含 WSDL 的本地副本(这在 EE 环境中需要一点魔法,即将 WSDL 打包到您的工件中并在您的 wsimport 中指定一个 wsdl-location (如果需要,我可以提供更多信息;这也是一个有效的解决方案:JAX-WS 客户端:访问本地 WSDL 的正确路径是什么?)。这解释了有关依赖关系的更多信息,但让它可用于互操作性:为什么 Java 客户端在运行时需要 WSDL?

话虽如此,听起来您实际上想要完成的是限制对 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

于 2013-06-12T17:39:21.517 回答