歡迎您光臨本站 註冊首頁

設計支持多os的ssl-vpn客戶端(二)——java和js的通信

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

設計支持多os的ssl-vpn客戶端(二)——java和js的通信

Tomqq 5/12/2008

Applet和js的通信有幾種不同的方案可以選擇,在這裡我選擇使用netscape.javascript.JSObject對象來進行。
舉例如下:
a)        java調用js
首先再applet裡面引入包import netscape.javascript.JSObject;
然後申明一個win對象:
public static JSObject win;
在init函數裡面進行初始化,win = JSObject.getWindow(this);

這樣子就可以了,如果需要執行js函數(比如alert()),採用如下這種方式調用:
Client.win.eval("alert(\』hi,tomqq\』)");
看起來還是蠻簡單的嘛,不過經過測試我發現,在連續刷新頁面的情況下,如果每次都重新載入win對象,再firefox下會有載入失敗的情況發生。在這個時候,我們可以用兩個辦法解決,一個是採用限制刷新的代碼(php),
        session_start();
        $allow_sep = "3";
        if (isset($_SESSION["post_sep"])) {
                if (time() - $_SESSION["post_sep"] < $allow_sep)  {
                        exit("Please refresh after 3 seconds.");
                } else {
                        $_SESSION["post_sep"] = time();
                }
        } else {
                $_SESSION["post_sep"] = time();
        }
另一個是把win對象作為虛擬機靜態變數,僅僅在頁面載入的時候載入,刷新的時候不載入,就可以很好的解決這個問題。

b)        js調用java
在這裡,首先要對載入的applet進行申明,如下:
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">";
        echo "<div align=\"center\">";
        echo "<applet ";
        echo "codebase = \"download/\"";
        echo "code = \"multios.applet.Client\" ";
        echo "archive = \"multios.jar,AuthKit.jar\" ";
        echo "name = \"client\" ";
        echo "width = \"0\" ";
        echo "height = \"0\" ";
        echo "hspace = \"0\" ";
        echo "vspace = \"0\" ";
        echo "align = \"middle\" ";
        echo "mayscript =\"\" ";
        echo "> ";
        echo "</applet> ";
即載入一個0象素大小的applet,這個applet在頁面不可見,不影響布局。另外注意的就是需要給這個applet對象起一個js能認識的名字,即:
echo "name = \"client\" ";這句話很重要。
Js調用applet的時候,可以這樣子:
window.document.client.SStart.method(),直接跟client的java方法名和參數即可。

值得注意的是,js和applet通信,涉及到頁面對於不同組件載入的問題,即:如果applet載入啟動並開始調用js,而js函數還沒有被頁面載入完成,這怎麼辦?使用firedebug或者safari的html調試器查看可以看見各個元素的載入時序圖,在這裡,一般將js放在html頁面前面,而把applet放在頁面的最後,即可解決這個問題。
另外,某些通信操作可能會造成瀏覽器,如firefox的崩潰,具體原因分析為瀏覽器對jre支持引起的,這個問題解決,但是可以根據實際情況繞過。
最後還有一個問題就是安全性問題,js調用的applet方法如果使用了受限的本地操作怎麼辦?這個問題在後一章會專門討論。


+=+=+=+=
tomqq.cublog.cn

[ 本帖最後由 tomqq 於 2008-5-23 13:05 編輯 ]

[火星人 ] 設計支持多os的ssl-vpn客戶端(二)——java和js的通信已經有736次圍觀

http://coctec.com/docs/service/show-post-30327.html