JBoss 4.2.2 Web服务soap:地址

时间:2009-09-02 19:21:00

标签: java web-services jboss

我在JBoss 4.2.2中将EJB3 bean部署为Web服务。在生产中,服务器位于Apache服务器后面,该服务器将请求重定向到Jboss服务器。这使得WSDL具有错误的soap:地址位置。我能够通过server \ default \ deploy \ jbossws.sar \ jbossws.beans \ META-INF中的配置文件更改端口和主机名,但是我无法将协议切换到https

我找到的唯一方法是指定我自己的WSDL(通过here)。通过在WSDL中指定https,JBoss会发现它是https。但是,尽管在生产中这很好,但在QA中没有使用https(并且连接到它的服务需要有效的https,因此自签名证书不会这样做)。因此,虽然我可以获得QA的真实证书(假证书颁发机构不会这样做),但我宁愿在质量保证中将其作为http。有没有办法强制JBoss更改协议或以其他方式更改地址,以便它在soap:地址中使用http?

编辑:这个问题似乎是最近在他们的bug database提出的并被拒绝了。这对我来说意味着他们有一个解决方法。但它是什么?

进一步编辑:此时,我知道EJB3拦截器不起作用(they are not activated at all)并且SOAPHandler不拦截调用以检索WSDL(已测试 - 它们会拾取其他所有内容)。所以过滤器的想法很吸引人,但目前还不清楚它的位置。

JBoss显示的URL是:

端点名称jboss.ws:context=QuickBooks-QuickBooksWebService,endpoint=QBWSBeanEJB 端点地址https://127.0.0.1:8443/QuickBooks-QuickBooksWebService/QBWSBeanEJB?wsdl

(注意,当我使用自定义WSDL强制https但JBoss配置为重写它时)。

我正在使用的JBossWS版本是与4.2.2捆绑在一起的版本,根据this,它是2.0.1

编辑:关于rewriting,这确实是尝试过的。这是我发现的。我可以让它重写主机(或不需要)和端口,但仅限于已识别的协议。因此,为了让它发出一个https,我必须将bean的传输保证配置为CONFIDENTIAL,并在JBoss服务器上启用https,然后所有请求都被重定向到JBoss中的https。我没有测试这是否适用于mod_jk(如果需要CONFIDENTIAL,AJP协议是否仍然有效,如果请求来自AJP,WSDL会获得正确的协议吗?我没有测试它),但是这样做具有相同的净效果 - 请求必须超过https。没有办法让请求通过http或AJP进入,然后让它发出一个soap:地址作为https,特别是基于每个服务器配置(在QA和dev,http,但在生产https中,即使ssl被Apache终止。使用自定义WSDL让我更接近,因为请求是在HTTP上进行的,但soap:地址表示https。完美的生产(使用重写功能将端口推送到443而不是8443),但对于QA无用(开发我不关心,因为开发构建可能会有所不同,如果需要可以创建一个不同的jar,但我'如果我可以避免使用不同的构建过程,那么我对QA和制作不满意。

3 个答案:

答案 0 :(得分:2)

为什么不在Web应用程序上设置servlet过滤器,该过滤器监视WSDL请求并使用其配置中的值重写响应中的soap:address?然后你可以随意设置它。

它可能不是最优雅的解决方案,我同意:-) - 但那样本来可以用于JBoss的可配置性,不是吗?如果JBoss最终引入了这个功能,你可以删除过滤器。

更新:典型的JBoss EAR具有以下结构:

myapp.ear
|+ META-INF
   |+ applications.xml and jboss-app.xml
|+ myapp.war
   |+ web pages and JSP /JSF pages
   |+ WEB-INF
      |+ web.xml, jboss-web.xml, faces-config.xml etc.
      |+ lib
         |+ tag library JARs
      |+ classes
         |+ servlets and other classes used by web pages
|+ myapp.jar
   |+ EJB3 bean classes
   |+ META-INF
      |+ ejb-jar.xml and persistence.xml
|+ lib
   |+ Library JARs for the EAR

您能确认部署的EAR是否具有此结构?如果没有,它有什么不同?

更新#2: JBoss自动为EJB3 bean生成web.xml,这些bean位于正在部署的EAR内的JAR中。这个web.xml肯定是硬编码的(即不用作你可以调整的XML文件的基础),所以改变它包含一个过滤器(你基本上需要)很尴尬(尽管不是不可能)更改jboss-beans.xml中的各种内容以指向您自己的web.xml生成器,它可以执行您想要的任何操作。如果EJB3 bean在WAR文件中,那么开发工作就会少得多 - 那么你可以使用WAR web.xml来常规地配置过滤器,你可能已经控制了它。但是,如果您使用的是第三方JAR,那么这可能会有问题 - 或者可能不会。在不知道细节的情况下,很难看出哪种方法最好。


从问题的作者编辑:

感谢您的所有努力。这似乎是基本方法 - 拦截和更改WSDL。如果你不能使你的webservice成为战争中分配的POJO,你可以在那里使用servlet过滤器,那么你可以创建一个代理请求的servlet,并以这种方式执行。 That was my solution

答案 1 :(得分:0)

过去我们遇到过类似的问题,并且决定在所有QA环境中使用SSL(有缺点 - 特别是在调试HTTP流时 - 但没有缺点?)

这可能比您想象的更容易,因为您似乎可以控制所涉及的所有环境:您基本上只需要告诉Java您的自签名证书是“好的”。为此,您需要将自己添加为Java中的证书颁发机构。

这里有一个很好的概述:

http://en.wikibooks.org/wiki/WebObjects/Web_Services/How_to_Trust_Any_SSL_Certificate

以下是来自Sun的有关KeyStore工具的信息(尽管您应该查找特定于您的版本/ JVM的参考,因为存在差异):

http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html

完成此操作后,您在QA中的自签名证书将在Java中100%“有效”。

您甚至可以在Prod中节省一些钱:如果您控制环境的两面,您可以在Prod中自行颁发证书并节省一些现金。哎呀,如果您的用户社区很小/控制得足够多,您也可以直接在客户端浏览器中添加自签名权限(虽然看起来它的价值会更麻烦)。

希望这能让你朝着有用的方向前进!

答案 2 :(得分:0)

基本上我发现的唯一解决方案是创建一个拦截和代理WSDL请求的servlet。我从Apache的数据透视项目中复制并实现了ProxyServlet(它进行了一些非实质性的更改,例如Apache实现只写了响应而不是帖子)。基本上,实现检查请求是否是对WSDL的请求,并更改WSDL中的soap:address属性。很不错,但是,它解决了这个问题,但整个事情仍然没有奏效,因为在我们进行沟通后,还有一个问题。关于我的另一个问题我猜。