2008-09-17 171 views
4

我在服務器端運行blazeds。我想用http頭過濾http請求。我的目標是向服務器發送額外的參數,而不更改我的blazeds服務的簽名。如何使用Flex RemoteObject方法設置HTTP標頭?

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

使用Flex WebService組件,可以使用屬性httpHeaders來設置http標頭。我還沒有在RemoteObject類上找到類似的東西...

回答

0

您可能試圖重新發明車輪。有沒有理由不能使用標準的HTTP驗證?

+0

不,我不能使用HTTP身份驗證,我有一個非常特殊的需求。 – 2008-09-17 20:12:29

1

RemoteObject使用AMF作爲數據通道,並以與HttpService或WebService(使用Http)完全不同的方式進行管理。 你可以做的是調用setCredentials(username,password),然後使用FlexLoginCommand(或者是你的容器的標準版本,或者派生自己的版本)在服務器端捕獲它。 查找setCredentials以及如何在雙方(客戶端和服務器)上處理此問題。

+3

RemoteObject調用通過HTTP進行,只是內容以Action Message Format(AMF)編碼。 – 2009-03-20 20:37:18

0

我一直在想使用http頭的一個原因是服務器能夠在服務版本化環境中「識別」flex客戶端。 在服務器上,我始終可以構建一個間接/代理,以允許不同的客戶端僅使用1個端點並根據客戶端版本路由到正確的適配器。 問題出在客戶端。服務器如何識別Flex客戶端令牌或'版本'。一種方法當然是通過身份驗證。但是,假設沒有涉及認證?

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)。

2

我不能從柔性修改HTTP請求,而不是我可以添加自定義頁眉到mx.messaging.messages.IMessageRemoteObject發送到服務器,並在那裏,延長flex.messaging.services.remoting.adapters.JavaAdapter(用於訪問春豆),它是更多鈔票來讀取頭參數,並把它們進入HTTPRequest。

在flex部分中,我不得不擴展mx.rpc.AsyncRequest: 聲明瞭一個新的屬性「header」並覆蓋了invoke方法,該方法檢查是否存在用於設置msg.headers的非空值。

mx.rpc.remoting.mxml.RemoteObject: 的構造函數創建我們的自定義AsyncRequest的一個新實例,並覆蓋舊AsyncRequest,它定義了一個setHeaders方法的參數設置爲自定義AsyncRequest

com.asfusion.mate.actions.builders.RemoteObjectInvoker(額外的:P): 這一個讀取大副地圖RemoteObjectInvoker宣佈帕拉姆,並在RemoteObject頭放。

我希望這將是可以理解的(與我的Apache英語XDDD)

再見。阿古爾!

-1

你可以在PHP中調試$ GLOBALS來查看。 我認爲這是在

$GLOBALS['HTTP_RAW_POST_DATA']; 

,或者你可以簡單的做

file_get_contents('php://input'); 
0

最近,我們遇到了同樣的問題,這是我們增加了我們的自定義標題,而無需創建一個子類:

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

AsyncRequest對象實際上可以通過操作對象通過mx_internal命名空間訪問。

2

這爲我工作用的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彈簧軟硬度:

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>