无法连接Flex-

时间:2012-04-17 17:34:02

标签: flex flex3

我在JBoss-5.1.0上部署了一个Java EE应用程序。为了获得额外的安全性,我已经使用Apache +启用了ssl来支持JBoss。 Tomcat使用(端口8001上的AJP 1.3)与服务器通信。所以我的配置如下:

tomcat:443 (ssl) ---|--- Jboss:8080 (IpAddress:8080) (http)

此配置似乎适用于除flex部分之外的所有静态和动态页面。 当我尝试访问flex部分时,我的问题就开始了。 AMF通道失败,我可以在服务器日志中看到以下堆栈跟踪:

  

2012-04-13 16:19:50,940 ERROR [org.apache.catalina.core.ContainerBase。[jboss.web]。[localhost]。[/ catissuecore]。[MessageBrokerServlet]](ajp-127.0.0.1 -8009-4)servlet的Servlet.service()MessageBrokerServlet引发了异常   flex.messaging.security.SecurityException:必须通过安全协议联系安全端点'/ messagebroker / amfsecure'。           在flex.messaging.endpoints.AbstractEndpoint.validateRequestProtocol(AbstractEndpoint.java:862)           在flex.messaging.endpoints.AbstractEndpoint.service(AbstractEndpoint.java:630)           在flex.messaging.endpoints.AMFEndpoint.service(AMFEndpoint.java:99)           在flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:424)           在javax.servlet.http.HttpServlet.service(HttpServlet.java:717)           在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)           在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)           在org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)           在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)           在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)           在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)           在org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)           在org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)           at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)           at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)           在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)           在org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)           在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)           在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)           在org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:436)           at org.apache.coyote.ajp.AjpProtocol $ AjpConnectionHandler.process(AjpProtocol.java:384)           在org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:447)           在java.lang.Thread.run(Thread.java:662)

我在remote-config.xml中定义了以下通道:

 <default-channels>
    <channel ref="my-amf"/>
     <channel ref="my-secure-amf"/>
 </default-channels>

我的services-config.xml有以下配置

 <channels>
    <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
        <endpoint uri="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        <properties>
            <polling-enabled>false</polling-enabled>
        </properties>
    </channel-definition>

    <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
        <endpoint uri="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
        <properties>
            <!--HTTPS requests on some browsers do not work when pragma "no-cache" are set-->
            <add-no-cache-headers>false</add-no-cache-headers>
        </properties>
    </channel-definition>

有人面对这个问题吗?

任何指针都非常有用。

2 个答案:

答案 0 :(得分:1)

虽然解决方案在另一个答案中,但并不明显。如果SSL在负载均衡器或Apache中终止,您应该按如下方式切换secure-amf通道定义类:

<channel-definition id="my-secure-amf" class="mx.messaging.channels.AMFChannel">

<channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">

来源:http://blogs.adobe.com/kmossman/2010/02/lcds_with_ssl_termination_with.html

答案 1 :(得分:0)

在我的情况下,我只允许HTTPS流量,并且允许所有这些HTTPS流量通过启用了ssl的Apache服务器进行路由。此外,我有一个负载均衡器,它与Apache发送HTTP请求而不是HTTPS请求,这是问题的根本原因。我更改了负载均衡器的设置,它运行正常。

例外:必须通过安全协议联系安全端点'/ messagebroker / amfsecure'。

  1. 此异常本身表示您尝试通过不安全协议连接到Flex客户端到安全端点。
  2. 安全端点从客户端接收消息/请求并对其进行解码,然后将其发送到MessageBroker以路由到服务。因此,请求未加密,安全端点将引发异常,因为解码请求时假定为加密请求。
  3. 有两种解决方案:

    • 找出将不安全请求发送到安全端点的原因。并尝试解决此问题。为此,您可能需要监控发送和接收的所有请求。
    • 打开services-config.xml文件,并将flex安全通道的端点类名更改为“flex.messaging.endpoints.AMFEndpoint”。通过更改此设置,您告诉Flex客户端通过不安全的端点处理所有请求。如果您不打扰您的配置并且只是希望应用程序正在运行,请执行此操作。