我在服务器端运行 blazeds。我想使用 http 标头过滤 http 请求。我的目标是在不更改我的 blazeds 服务签名的情况下向服务器发送额外的参数。
在客户端,我使用 Flex RemoteObject方法。
使用 Flex WebService 组件,可以使用属性httpHeaders设置 http 标头。我在 RemoteObject 类上没有发现任何类似的东西......
我在服务器端运行 blazeds。我想使用 http 标头过滤 http 请求。我的目标是在不更改我的 blazeds 服务签名的情况下向服务器发送额外的参数。
在客户端,我使用 Flex RemoteObject方法。
使用 Flex WebService 组件,可以使用属性httpHeaders设置 http 标头。我在 RemoteObject 类上没有发现任何类似的东西......
这对我使用 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>
我无法修改来自 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)
再见。阿古尔!
RemoteObject 使用 AMF 作为数据通道,其管理方式与 HttpService 或 WebService(使用 Http)完全不同。您可以做的是调用setCredentials(username,password)
,然后使用 FlexLoginCommand 在服务器端捕获它(您的容器的标准命令,或者您自己的)。查找setCredentials
以及如何在双方(客户端和服务器)上处理此问题。
我有类似的问题,恐怕在使用 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)。
我也在考虑使用 http 标头的一个原因是服务器能够在服务版本控制的上下文中“识别”弹性客户端。在服务器上,我总是可以构建一个间接/代理,允许不同的客户端仅使用 1 个端点并根据客户端版本路由到正确的适配器。问题在客户端。服务器将如何识别 flex 客户端令牌或“版本”。一种方法当然是通过身份验证。但是,假设不涉及身份验证?
您可能正在尝试重新发明轮子。您是否有不能使用标准 HTTP(s) 身份验证的原因?
我们最近遇到了同样的问题,这就是我们在不创建子类的情况下添加自定义标题的方式:
var operation:AbstractOperation = _remoteSession.getOperation('myRemoteOperation');
var async:AsyncRequest = operation.mx_internal::asyncRequest;
async.defaultHeaders = {my_header:'my_value'};
AsyncRequest 对象实际上可以通过 mx_internal 命名空间的操作对象访问。
您可以在 PHP 中调试 $GLOBALS 以查看它。我认为这是在
$GLOBALS['HTTP_RAW_POST_DATA'];
或者你可以简单地做
file_get_contents('php://input');