我在 JBoss 4.2.2 中部署了一个 EJB3 bean 作为 Web 服务。在生产中,服务器位于 Apache 服务器后面,该服务器将请求重定向到 Jboss 服务器。这使得 WSDL 具有错误的soap:address 位置。我能够通过 server\default\deploy\jbossws.sar\jbossws.beans\META-INF 中的配置文件更改端口和主机名,但我无法将协议切换为 https 。
我发现的唯一方法是指定我自己的 WSDL(通过here https://stackoverflow.com/questions/1380355/javax-jws-webservice-wsdllocation-with-jboss-4-2-2/1380499#1380499)。通过在 WSDL 中指定 https,JBoss 会识别出它是 https。然而,尽管这在生产中很好,但在 QA 中不使用 https(并且连接到它的服务需要有效的 https,因此自签名证书不行)。因此,虽然我可以获得真正的 QA 证书(假证书颁发机构不会这样做),但我宁愿在 QA 中使用 http。有没有办法强制 JBoss 更改协议或以其他方式更改地址,以便它在soap:address 中使用http?
编辑:这个问题似乎是最近在他们的错误数据库 https://jira.jboss.org/jira/browse/JBPAPP-2605并被拒绝。这对我来说意味着他们有解决办法。但它是什么?
进一步编辑:此时,我知道 EJB3 拦截器不起作用(它们根本没有被激活 https://jira.jboss.org/jira/browse/EJBTHREE-1206)并且 SOAPHandler 不会拦截检索 WSDL 的调用(经过测试 - 它们会获取其他所有内容)。所以过滤器的想法很有趣,但还不清楚把它放在哪里。
JBoss 显示的 URL 是:
端点名称 jboss.ws:context=QuickBooks-QuickBooksWebService,endpoint=QBWSBeanEJB
端点地址https://127.0.0.1:8443/QuickBooks-QuickBooksWebService/QBWSBeanEJB?wsdl https://127.0.0.1:8443/QuickBooks-QuickBooksWebService/QBWSBeanEJB?wsdl
(请注意,这是当我使用自定义 WSDL 强制 https 但 JBoss 配置为重写它时)。
我使用的 JBossWS 版本是与 4.2.2 捆绑在一起的,根据this http://anonsvn.jboss.org/repos/jbossas/tags/JBoss_4_2_2_GA/build/docs/readme.html是 2.0.1
编辑:关于重写 http://www.jboss.org/community/wiki/JBossWS-UserGuide#Address_rewrite,这确实是尝试过的。这是我发现的。我可以让它重写主机(或不根据需要)和端口,但仅限于可识别的协议。因此,为了让它发出 https,我必须将 bean 的传输保证配置为 CONFIDENTIAL,并在 JBoss 服务器上启用 https,然后所有请求都重定向到 JBoss 内的 https。我没有测试这是否适用于 mod_jk(如果需要 CONFIDENTIAL,AJP 协议是否仍然有效,如果请求通过 AJP 发送,WSDL 是否会获得正确的协议?我没有测试它),但是这样做具有相同的最终效果 - 请求必须通过 https 进行。没有办法让请求通过 http 或 AJP 传入,然后让它以 https 的形式发出soap:address,专门针对每个服务器进行配置(在 QA 和开发中,http,但在生产 https 中,即使ssl 已被 Apache 终止)。使用自定义 WSDL 让我更接近了,因为请求是通过 HTTP 传入的,但soap:address 显示的是 https。非常适合生产(使用重写功能将端口推送到 443 而不是 8443),但对于 QA 来说毫无用处(我不关心开发,因为开发版本可能不同,如果需要的话可以创建不同的 jar,但我'如果我可以避免的话,我对 QA 和生产具有不同的构建流程感到不舒服)。