4

我在服务器端运行 blazeds。我想使用 http 标头过滤 http 请求。我的目标是在不更改我的 blazeds 服务签名的情况下向服务器发送额外的参数。

在客户端,我使用 Flex RemoteObject方法。

使用 Flex WebService 组件,可以使用属性httpHeaders设置 http 标头。我在 RemoteObject 类上没有发现任何类似的东西......

4

8 回答 8

3

这对我使用 BlazeDS 和 Spring-Flex 1.5.2 有效

柔性:

use namespace mx_internal;

var service:RemoteObject = new RemoteObject(destination);
var operation:Operation = service[functionName];
operation.asyncRequest.defaultHeaders  = {company:'company'};

var token:AsyncToken =  operation.send();

Java Spring-Flex:

public class FlexJavaCustomAdapter extends JavaAdapter{
    @Override
    public Object invoke(Message message) {
        String locale = (String) message.getHeader("com.foo.locale");   
        return super.invoke(message);
    }   
}

调度程序-servlet.xml

<bean id="customAdapter" class="org.springframework.flex.core.ManageableComponentFactoryBean">
            <constructor-arg value="com.codefish.model.flex.FlexJavaCustomAdapter"/>
        </bean> 

        <flex:message-broker id="_messageBroker"  services-config-path="classpath*:/com/codefish/resources/spring/services-config.xml"  > 
              <flex:remoting-service default-adapter-id="customAdapter" 
            default-channels="my-amf, my-secure-amf" />
        </flex:message-broker>
</bean>
于 2015-04-03T17:34:08.970 回答
3

我无法修改来自 flex 的 http 请求,而是可以将自定义标头添加到mx.messaging.messages.IMessage发送RemoteObject到服务器并在那里扩展flex.messaging.services.remoting.adapters.JavaAdapter(用于访问 Spring beans),读取标头参数并将它们放入 HTTPRequest 是可能的。

在 flex 部分,我必须扩展mx.rpc.AsyncRequest:声明一个新属性“header”并覆盖调用方法,该方法检查是否有一个非空值来设置 msg.headers。

mx.rpc.remoting.mxml.RemoteObject:构造函数创建我们自定义 AsyncRequest 的新实例并覆盖旧实例,AsyncRequest它定义了一个setHeaders将参数设置为自定义的方法AsyncRequest

com.asfusion.mate.actions.builders.RemoteObjectInvoker(额外:P):这个读取在伴侣的地图中声明的参数RemoteObjectInvoker并放入RemoteObject标题中。

我希望它是可以理解的(用我的apache英语xDDD)

再见。阿古尔!

于 2010-07-05T08:55:25.177 回答
1

RemoteObject 使用 AMF 作为数据通道,其管理方式与 HttpService 或 WebService(使用 Http)完全不同。您可以做的是调用setCredentials(username,password),然后使用 FlexLoginCommand 在服务器端捕获它(您的容器的标准命令,或者您自己的)。查找setCredentials以及如何在双方(客户端和服务器)上处理此问题。

于 2008-09-25T12:44:37.820 回答
1

我有类似的问题,恐怕在使用 AMF 时没有简单的方法来设置 HTTP 标头。但我设计了以下解决方案。

Flex 使用 HTTP 传输 AMF,但通过浏览器接口调用它,这允许您设置 cookie。仅在包含应用程序调用的文档中遵循 JavaScript

document.cookie="clientVersion=1.0;expires=2100-01-01;path=/";

浏览器应将其传输到服务器,您可以进行过滤(问题是用户是否会关闭 cookie)。

您可以从 Flex 调用更多的 JavaScript 函数(更多内容在这里: http://livedocs.adobe.com/flex/3/html/help.html?content= passingarguments_4.html)。

于 2010-07-01T08:22:53.693 回答
0

我也在考虑使用 http 标头的一个原因是服务器能够在服务版本控制的上下文中“识别”弹性客户端。在服务器上,我总是可以构建一个间接/代理,允许不同的客户端仅使用 1 个端点并根据客户端版本路由到正确的适配器。问题在客户端。服务器将如何识别 flex 客户端令牌或“版本”。一种方法当然是通过身份验证。但是,假设不涉及身份验证?

于 2009-04-22T10:38:52.130 回答
0

您可能正在尝试重新发明轮子。您是否有不能使用标准 HTTP(s) 身份验证的原因?

于 2008-09-17T09:56:56.397 回答
0

我们最近遇到了同样的问题,这就是我们在不创建子类的情况下添加自定义标题的方式:

var operation:AbstractOperation = _remoteSession.getOperation('myRemoteOperation');
var async:AsyncRequest = operation.mx_internal::asyncRequest;
async.defaultHeaders = {my_header:'my_value'};

AsyncRequest 对象实际上可以通过 mx_internal 命名空间的操作对象访问。

于 2014-11-04T21:56:24.473 回答
-1

您可以在 PHP 中调试 $GLOBALS 以查看它。我认为这是在

$GLOBALS['HTTP_RAW_POST_DATA'];

或者你可以简单地做

file_get_contents('php://input');
于 2013-03-12T20:08:21.863 回答