5947


「[ファイルダウンロード完了後に画面遷移などをjavascriptで行う](http://d.hatena.ne.jp/nabehiro/20140208/1391850498)」を参考にASP.NET
MVCで実装してみました。

サーバー側はファイルをダウンロードをさせつつCookieをセット、クライアント側はJavaScriptで定期的にCookieをチェックすることでダウンロードの完了を検出する、というものですが、サーバーで設定した
**Cookieがブラウザ側で有効になるのはサーバーからレスポンスデータをすべて受け取った後** と理解して良いでしょうか？

下記コードで実行してみましたが、レスポンスをすべて受信する前にCookieが有効になっているように思われました。（思われました、というのはダウンロードを途中で一時停止する方法が分からなかったので、ダウンロード完了前にalertが表示されてしまうことを確実に確認できていないため）

cshtmlは

[code]

    <a href="/Home/Download" id="download">download</a>
    <script>
      $('#download').click(function () {
        var intervalID = setInterval(function () {
          if ($.cookie('downloaded')) {
            clearInterval(intervalID);
            $.removeCookie('downloaded', { path: '/' });
            alert('ダウンロード完了');
          }
        }, 1000);
      });
    </script>
    
[/code]

コントローラーは

[code]

    public ActionResult Download()
    {
        var cookie = new HttpCookie("downloaded");
        cookie.Value = "yes";
        Response.Cookies.Add(cookie);
    
        var path = @"c:\hoge.jpg";
        return File(path, "image/jpeg", "fuga.jpg");
    }
    
[/code]


CC BY-SA 3.0
2015-02-02T14:54:21.550
5798
2015-02-04T12:14:37.810
3925
question
javascript html asp.net cookie
Cookieの値がブラウザ側で有効になるタイミングはいつか


細かく実証したわけではないので、大幅に外している可能性はありますが、 Cookie の処理についての指示が書かれている、

  * [RFC 6265 - HTTP State Management Mechanism](https://www.rfc-editor.org/rfc/rfc6265) ([日本語訳](http://www.hcn.zaq.ne.jp/___/WEB/RFC6265-ja.html))

によると、「 **ブラウザがHTTP ヘッダをパースした時点で Cookie は設定される。** 」 と解釈できます。

> [_Section 5.2_](https://www.rfc-editor.org/rfc/rfc6265#section-5.2)  
>  ...  
>  **When the user agent finishes parsing the set-cookie-string, the user
> agent is said to "receive a cookie" from the request-uri** with name cookie-
> name, value cookie-value, and attributes cookie-attribute-list. (See Section
> 5.3 for additional requirements triggered by receiving a cookie.)

意訳「ブラウザが Set-Cookieヘッダ(set-cookie-string)をパースした時、『Cookie
を受信せよ』とされたものとする。Cookie を受信する際の細かな要求事項については、 Section 5.3 を参照のこと」

とあるので、 Section 5.3 を読んでみますと、

> [_Section 5.3_](https://www.rfc-editor.org/rfc/rfc6265#section-5.3)  
>  ...  
>  When the user agent "receives a cookie" from a request-uri with name
> cookie-name, value cookie-value, and attributes cookie-attribute-list, the
> user agent **MUST** process the cookie as follows:
>
> 1 . A user agent MAY ignore a received cookie in its entirety. For example,
> the user agent might wish to block receiving cookies from "third-party"
> responses or the user agent might not wish to store cookies that exceed some
> size.  
>  ...  
>  ...  
>  ...  
>  12 . Insert the newly created cookie into the cookie store.

項目(12) で Cookie ストレージに保管することが指定されています。

### ■ Firefox の Cookie 確認ダイアログについて

Mozilla Firefox で `about:config` から `network.cookie.lifetimePolicy=1`
とすることで、懐かしの Cookie 確認ダイアログが _－サイトによっては数百回も－_ 表示されるようにできます。

そのダイアログの動作をみると、 `Set-Cookie`
があるページを読込途中で確認ダイアログがポップアップし、ユーザが確認しなければページの読込が再開されません。これは、「HTTPヘッダのパース時、
Cookie の設定直前に処理を止め、その時点時点でクッキーを有効にするか確認している」と受け取ることができそうです。


CC BY-SA 3.0
2015-02-04T12:00:27.273
5947
2015-02-04T12:14:37.810
2021-10-07T07:05:27.390
-1
4978
5798
answer