0

我有一个 Flex 应用程序,但在安全登录/注销我的 Java 服务器应用程序时遇到问题。它在开发环境中运行良好(FlashBuilder 运行 Flex 并与 Apache Tomcat 通信),但是当我们尝试使用在同一个 Tomcat 上部署的导出的 flex 应用程序时失败。

我们有一个大型、复杂的应用程序,它有一个 Flex 前端和一个 Java 后端,它在 Tomcat 上作为 Web 应用程序运行。我们希望登录/注销过程使用 HTTPS,以便用户名和密码被加密并且不受某些安全问题的影响。

不安全登录的工作方式是通过 BlazeDS RPC 调用一个名为 login 的方法。用户的凭据作为方法的参数。 (顺便说一句:这是推荐的登录方式吗?)

安全登录的工作方式不同。令牌是从提供用户 ID 和密码的通道集创建的,并且 AsyncResponder 调用成功或失败函数。登录代码显示在下面的更新 #2 中。

当我在 Flash Builder 中针对 Apache Tomcat(版本 7.0.29)运行我的应用程序时,安全登录和注销成功。无论我处于标准运行模式还是调试模式,这都有效。

但是,一旦我创建了我的应用程序并将其部署到我的服务器,它就会失败并出现一个非常普遍的错误。

我确信我已经正确设置了 Tomcat 的 HTTPS 端(因为应用程序在开发环境中工作)。我相信问题在于当 Flex 应用程序从file:///...index.html它运行时可以工作,但是一旦我尝试从http://localhost:8080/MyApp/它运行它就会失败。

这几天我一直在拉头发。任何人都可以提供的任何指针、文档等将不胜感激。

我决定不在这个问题中包含 services-config.xml、remoting-config.xml 等文件,因为它们很大并且包含的​​内容超出了此处的相关内容,但我可以根据要求提供它们。

更新:1

在查看了我发布的代码后,我在这个问题上犯了一个错误。login RPC 方法用于不安全的登录尝试,而通过 mx.messaging.ChannelSet 登录则用于安全登录。我已经更新了问题以反映这一点。

更新:2

返回的错误是mx.rpc.events.FaultEvent具有以下字段的:

Fault String: Send failed
Fault Code: Client.Error.MessageSend

登录功能(Flex 端)为:

public function login(username:String, password:String, loginFunction:Function = null, failureFunction:Function = null):void {
    if (_usingSecuredConnection) {
        this.loginSuccessFunction = loginFunction;
        this.loginFailureFunction = failureFunction;

        // Make sure that the user is not already logged in.
        if (_channelSet.authenticated == true) {
            AlertUtil.alertError("You are already logged in!");
            return;
        }

        token = _channelSet.login(username, password);
        token.addResponder(new AsyncResponder(loginResultEvent, loginFaultEvent));
    } else {
        // Defer to API
    SecurityAPI.login(username, password, [onLoginResultNonSecured, loginFunction], [onLoginFailure, failureFunction]);
    }
}

在尝试安全登录时,它总是会导致调用函数 loginFaultEvent 并使用上述 FaultEvent 调用。

更新 3

我确信这现在是一个跨域问题。尝试从 http 访问 https 是问题所在。但是,我将我认为非常宽松的跨域文件放在了我的 Tomcat 服务器的 ROOT webapp 中,但它没有帮助。有人知道我在做什么错吗?它是Tomcat7的错误位置还是我的跨域文件有错误?(注意:8443 是我的安全端口)

跨域.xml:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="all" />
    <allow-access-from domain="*" secure="false" to-ports="8443"/>
    <allow-http-request-headers-from domain="localhost" headers="*" secure="false"/>
</cross-domain-policy>

更新 4

我现在已经克服了这个问题:这是一个跨域问题,通过在我的 tomcat 服务器的 ROOT webapp 目录中放置一个跨域文件来解决。该跨域文件的内容是:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="*" secure="false"/>
</cross-domain-policy>

我的 flex 应用程序现在可以使用 IE9 和 Chrome 很好地通信 HTTP 和 HTTPS。

但是它仍然无法在 Firefox 上运行。

谢谢,

菲尔

4

0 回答 0