我们的应用程序在JBoss EAP 6.4中运行。我们的开发设置提供在端口8080上以HTTP模式运行的JBoss实例和具有HTTP(端口9090)和HTTPS(端口9443)端点的反向代理,以帮助测试不同的方案。
当我尝试通过将UriInfo
注入我的请求处理程序来使用“当前”URL时出现问题。 URI内部的方案部分始终取决于standalone.xml
中连接器设置的scheme属性,而不是实际使用的方案。例如,如果我在连接器的方案设置为https://localhost:9443
时调用http://localhost:9090
和https
,则两个网址都会转换为HTTPS,即https://localhost:9443
,但https://localhost:9090
。如果我将连接器的方案切换到http
,则两个URL都将更改为HTTP。不用说,X-Forwarded-Proto
也被忽略了。
有没有办法让JBoss更像大多数其他应用服务器,即不对使用环境做出任何假设,尤其是反向代理和负载平衡器?
答案 0 :(得分:0)
RemoteIpValve 应该做您需要的一切。
JBossWeb 7.5.20(EAP 6.4.20)的源代码: http://anonsvn.jboss.org/repos/jbossweb/tags/JBOSSWEB_7_5_20_FINAL/src/main/java/org/apache/catalina/valves/RemoteIpValve.java
这是上游Apache Tomcat 7.0项目网站上更易读的文档: https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html
您的案例中的最小配置将是Web子系统中的以下全局阀配置:
<valve name="remoteip-valve" module="org.jboss.as.web" class-name="org.apache.catalina.valves.RemoteIpValve">
<param param-name="protocolHeader" param-value="X-Forwarded-Proto"/>
</valve>
这将根据X-Forwarded-Proto标头的值设置方案。 对于https,它还会将secure标志设置为true并将端口设置为443。 由于您似乎要求将HTTPS端口设置为9443,您可以通过其他 httpsServerPort 参数执行此操作(我认为您还需要将httpServerPort设置为9090,如上所述,因为RemoteIpValve会将其覆盖为80,否则),例如
<valve name="remoteip-valve" module="org.jboss.as.web" class-name="org.apache.catalina.valves.RemoteIpValve">
<param param-name="protocolHeader" param-value="X-Forwarded-Proto"/>
<param param-name="httpServerPort" param-value="9090"/>
<param param-name="httpsServerPort" param-value="9443"/>
</valve>
如果需要,您可以使用该阀门做更多事情,只需查看文档以获取更多详细信息。
此处还简要描述了(需要RH登录):https://access.redhat.com/solutions/629863
BTW如果您能够使用AJP协议(从代理服务器到应用程序服务器),则不需要这样做,因为AJP是针对这些情况而设计的,并且所有必需的信息都应该转移到应用程序。服务器非常透明。