シリーズのクッキーのドメイン間


cookie
定義#テイギ#
Cookie技術はHTTPプロトコルのインターネット上の急速な発展に由来する.インターネットの急速な発展に伴い、人々はより複雑なインターネットインタラクティブな活動を必要とし、サーバと活動状態を維持しなければならない.ユーザのニーズに応えるために,Cookie技術を含む種々のWebブラウズ状態を維持する手段が技術的に提案されている.
さぎょうげんり
  • ブラウザがサーバ
  • に初めてアクセス
  • サーバはCOOKIEを生成し、SESSIONID
  • を設定する.
  • サーバは、ブラウザ
  • にCOOKIEを返す.
  • ブラウザローカル保存COOKIE
  • 以降HTTPリクエストブラウザ毎にCOOKIEがサーバ側
  • に送信.
    クッキー構成
    フィールド
    さぎょう
    name
    唯一決定されたクッキー名.通常、クッキーの名前は大文字と小文字を区別しません
    value
    クッキーに格納されている文字列の値.クッキーのnameとvalueのurl符号化が望ましい
    domain
    クッキーはどのドメインに有効ですか.このクッキー情報は、ドメインに送信されたすべてのリクエストに含まれます.この値には、yq.aliyun.comなどのサブドメインを含めることも、含まないこともできます(.aliyun.comなど、aliyun.comのすべてのサブドメインに有効です).
    path
    このクッキーが影響するパスを表し、ブラウザはこの構成に基づいて、指定したドメインで一致するパスのようにクッキーを送信します.
    expires
    失効時間は、クッキーがいつ削除されるべきかを示すタイムスタンプ(すなわち、このクッキーのサーバへの送信を停止すべきか)である.このタイムスタンプを設定しないと、ブラウザはページが閉じたときにすべてのクッキーを削除します.ただし、自分で削除時間を設定することもできます.この値はGMT時間フォーマットであり,クライアントとサーバ側の時間が一致しない場合,expiresを使用するとばらつきがある.
    max-age
    expiresと同様に、ブラウザにこのクッキーが一定の時点ではなく、どのくらい期限切れになったか(単位は秒)を伝えるために使用されます.通常、max-ageの優先度はexpiresより高い
    HttpOnly
    ブラウザにスクリプトdocument.cookieでこの値を変更できないことを通知します.同じように、この値はdocument.cookieでも表示されません.しかし、httpリクエストではこのクッキーを携帯します.この値はスクリプトでは取得できませんが、ブラウザインストールディレクトリにはファイル形式で存在します.この設定は通常サーバ側で設定されます
    secure
    セキュリティフラグは、指定後、SSLリンクを使用している場合にのみサーバに送信され、httpリンクであれば送信されません.セキュリティ属性が設定されていても、あなたのマシンがローカルに保存しているクッキー情報を見ることができないわけではありませんので、クッキーに重要な情報を置かないでください.
    サービス側クッキー
    クッキーの設定
            //  COOKIE
            Cookie cookie = new Cookie("JSEESIONID", UUID.randomUUID().toString());
            //     
            cookie.setDomain(".baidu.com");
            //    ,     
            cookie.setPath("/");
            //       ,cookie       ,       ,       
            //-1       
            cookie.setMaxAge(60 * 60 * 24 * 365);
            cookie.setHttpOnly(true);
            response.addCookie(cookie);
    

    解析クッキー
            //  cookie
            Cookie[] cookies = request.getCookies();
    
            for (Cookie ck : cookies) {
                log.info("cookie  :{}", ck.getName());
                //  cookie  
                if ("modify".equals(ck.getName())) {
                    ck.setHttpOnly(false);
                    ck.setMaxAge(-1);
                    ck.setPath("/path");
                    response.addCookie(ck);
                }
            }
    

    ブラウザクッキー
    送信ルール
    URLパスを要求すると、ブラウザはこのURLパスに基づいて条件に合致するCookieをRequestリクエストヘッダに戻し、サービス側はrequest.getCookies()を介してすべてのcookieを取得する
    Jquery操作Cookie
    //    "  cookie"
    $.cookie('the_cookie', 'the_value');
    //    cookie         7 
    $.cookie('the_cookie', 'the_value', {
          expires: 7 });
    //    cookie    cookie     
    $.cookie('the_cookie', 'the_value', {
          expires: 7, path: '/' });
    //  cookie
    $.cookie('the_cookie');
    //  cookie
    $.cookie('the_cookie', null); //    null  cookie    
    //    
    $.cookie('the_cookie','the_value',{
         
        expires:7, 
        path:'/',
        domain:'jquery.com',
        secure:true
    }) 
    

    パラメータの説明
  • expires:(日|日付)有効期間;整数を設定する場合、単位は日です.Cookieの有効期限として日付オブジェクトを設定することもできます.
  • path:(String)Cookieのページパスを作成します.
  • domain:(String)このCookieのページドメイン名を作成します.
  • secure:(Booblean)trueに設定すると、このCookieの転送には、HTTPSなどのセキュリティプロトコルが必要になります.

  • クッキーのドメイン間での問題(ドメイン間リクエストでクッキーをどのように携帯するか)
    の原因となる
  • cookieパス:異なるパスの下のURL要求、cookieは互いに
  • にアクセスできない
  • cookieドメイン:異なるドメインのURL要求、cookieは互いに
  • にアクセスできない
    ソリューション
  • nginx逆エージェント
  • jsonp
  • 前後端合わせ(フロントエンド設定withCredentialsがtrue、バックエンド設定Headerの方式)
  • nginx逆エージェント
    //                     nginx        , 5500   3000     3003   
    server
    {
         
       listen 3003;
       server_name localhost;
       ##  = /         / url,     http://localhost:5500
       location = / {
         
           proxy_pass http://localhost:5500;
       }
       ##  /no    /no   url,  /no1,no/son,  no/son/grandson
       ##       http://localhost:5500/no   url
       ##    proxy_pass   /  http://localhost:3000/;  /no/son,      http://localhost:3000/son
       location /no {
         
           proxy_pass http://localhost:3000;
       }
       ##  /ok/       ok   url,/ok2      ,/ok/son   
       location /ok/ {
         
           proxy_pass http://localhost:3000;
       }
    }
    

    jsonp
    サーバ
    @WebServlet("/JsonServlet")
    public class JsonServlet extends HttpServlet 
    {
        private static final long serialVersionUID = 4335775212856826743L;
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException 
        {
            String callbackfun = request.getParameter("mycallback");
            System.out.println(callbackfun);    // callbackFun
            response.setContentType("text/json;charset=utf-8");
            
            User user = new User();
            user.setName("yuanfang");
            user.setAge(100);
            Object obj = JSON.toJSON(user);
            
            System.out.println(user);            // com.tz.servlet.User@164ff87
            System.out.println(obj);            // {"age":100,"name":"yuanfang"}
            callbackfun += "(" + obj + ")";    
            System.out.println(callbackfun);    // callbackFun({"age":100,"name":"yuanfang"})
            
            response.getWriter().println(callbackfun);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException 
        {
            this.doPost(request, response);
        }
    
    }
    

    フロントエンド
    <script type="text/javascript">
    function callbackFun(data)
    {
         
        console.log(111);
        console.log(data.name);
        //data.age = 10000000;
        //alert(0000);
    }
    
    $("#submit").on("click", function(){
              
            $.ajax({
         
                type:"post",
                url:"http://localhost:8080/html5/JsonServlet",
                dataType:'jsonp',
                jsonp:'mycallback',//     ,   jsonp     
                jsonpCallback:'callbackFun',
                success:function(data) {
            
                    console.log(data.age);
                }
            });
        })
    </script>
    

    前後の組み合わせ
    サーバ
    //      Cookie
    //     Cookie     ,    Access-Control-Allow-Credentials   true;
    response.setHeader("Access-Control-Allow-Credentials", "true");
    
    //Access-Control-Allow-Origin     ”*”,         ,     
    response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
    
    //             
    response.setHeader("Access-Control-Allow-Headers","content-type");
    

    フロントエンド
    $.ajax({
         
        type: "POST",
        url: "       ",
        data: {
         },
        dataType: "json",
        crossDomain:true, //     true
        xhrFields: {
         
            withCredentials: true //     ,            cookie 
        },
        success: function(data){
         
            alert("    ");      
        }
    });
    

    AjaxはCookieの携帯を要求
  • **同源:**ajaxは自動的に同源のcookieを持ってきて、異なるソースのcookie
  • を持っていません
  • **異なるソース:**フロントエンド設定withCredentialsをtrue、バックエンド設定Headerの方式ajaxに異なるソースのクッキー
  • を自動的に持ち込む
    サーバーのドメイン間リクエスト構成
    //      (           Cookie)
    //       ,*      ,    DDoS     。
    response.setHeader("Access-Control-Allow-Origin","*");
    
    //               
    response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma,Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
    
    /**                 ,  2     **/
    
    //     Cookie     ,    Access-Control-Allow-Credentials   true;
    response.setHeader("Access-Control-Allow-Credentials", "true");
    
    //     Access-Control-Allow-Methods              POST, GET OPTIONS      。
    //     HTTP/1.1 Allow: response header   ,                 。
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    
    //            86400  ,    24   。      ,                  。
    //   ,                ,                  ,     。
    response.setHeader("Access-Control-Max-Age", "86400");
    
    // IE8   XDomainRequest        ,        IE
    response.setHeader("XDomainRequestAllowed","1");