57525


HTMLで、ブラウザの終了時前、あるいは他のページへ遷移時前に、CGIを実行する事は可能でしょうか？  
ホームページの表示時に、サーバー側のあるアプリを起動し、終了時にそのアプリも終了したいのですが、表示時は、CGIにリダイレクトすることで実行できたのですが、終了がなかなかうまく行きません。  
HTML内に、リンクを張ってCGIを呼び出して終了すれば出来るのですが、つい忘れてしまうので、自動的にCGIを呼び出したいのです。  
onunloadなどで、画面遷移の警告を出すやり方を真似てみてもうまく行かないようです。

よろしく、お願いいたします。

追伸 ～～～～～～～～  
onbeforeunloadも試してみました

[code]

    <head>
    <title>JavaScript Test</title>
    <script type="text/javascript">
    <!--
    window.onbeforeunload = function(){
        /cgi-bin/app.cgi
        return false;
    } -->
    </script></head>
    
[/code]

このコードで、他のサイトへ遷移しようとしましたが、うまく動きませんでした  
/cgi-bin/app.cgiの部分が、alert("メッセージ")なら動くのですが、  
実行後の結果は、サーバーサイドのみで、画面表示は特に必要ありません  
書き忘れてましたが、Webサーバーは現在Apache2です、node.jsならもっと簡単なんてのがあれば


CC BY-SA 4.0
2019-08-20T22:10:47.303
57492
2019-08-22T02:21:20.433
2019-08-22T01:29:59.100
15090
15090
question
html cgi
ブラウザの終了時前、あるいは他のページへ遷移時前にCGI実行する方法


短い答え：通常にはありえない仕様なので考察しなおすことを強く推奨します

長い答え：  
「ユーザーがブラウザを閉じたら」というのが既に固定観念です。ブラウザでないプログラムから `GET`
が要求されることはごく普通に存在します。例えば検索エンジンのクローラとか。例えば `curl` のような HTML
ソースを得て終了するようなツールとか。例えば `javascript` をユーザーが無効にしているとか。

クローラが探しに来たら「サーバー上のアプリ」が何個も起動して終了タイミングが存在しないわけで、短時間のうちにサーバーリソースが枯渇しサービス不能になりそうです。どこぞの図書館の事件を彷彿とさせます。

なんとなくですがセッション維持のために別プログラムが必要とか考えているような気のせいがします。その辺普通は `cookie` を使うなどの対処で十分なはず。


CC BY-SA 4.0
2019-08-21T01:25:16.913
57496
2019-08-21T01:25:16.913
8589
57492
answer


onbeforeunloadイベントで、画面遷移の前に特定の処理を実行できるイベントです。  
[この参照すれば](https://kght6123.work/%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AE%E9%96%89%E3%81%98%E3%82%8B%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AB%E5%89%B2%E3%82%8A%E8%BE%BC%E3%82%80-javascript-
jquery/)


CC BY-SA 4.0
2019-08-21T04:10:42.043
57503
2019-08-21T04:10:42.043
35385
57492
answer


”/cgi-bin/app.cgi”などの文字列を書いても飛ばない（サーバへの送信しない）ので  
**全てを省いたjavascriptのサンプルコードを書いて見ました。**  
私のローカル環境では、ブラウザを閉じたらsendしている様です。  
（xhr.onreadystatechangeもただ送信するだけなら要りません。）

[code]

    <script type="text/javascript">
        window.onbeforeunload = function(){
            var xhr = new XMLHttpRequest();
    
            xhr.open("GET", "/cgi-bin/app.cgi", true);
            xhr.onreadystatechange = function(){
                console.log(xhr.responseText);
            };
    
            xhr.send();
        }
    </script>
    
[/code]


CC BY-SA 4.0
2019-08-22T02:09:45.467
57525
2019-08-22T02:21:20.433
2019-08-22T02:21:20.433
22793
22793
57492
answer