シリーズのクッキーのドメイン間
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リンクであれば送信されません.セキュリティ属性が設定されていても、あなたのマシンがローカルに保存しているクッキー情報を見ることができないわけではありませんので、クッキーに重要な情報を置かないでください.
サービス側クッキー
クッキーの設定
解析クッキー
ブラウザクッキー
送信ルール
URLパスを要求すると、ブラウザはこのURLパスに基づいて条件に合致するCookieをRequestリクエストヘッダに戻し、サービス側はrequest.getCookies()を介してすべてのcookieを取得する
Jquery操作Cookie
パラメータの説明 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逆エージェント
jsonp
サーバ
フロントエンド
前後の組み合わせ
サーバ
フロントエンド
AjaxはCookieの携帯を要求**同源:**ajaxは自動的に同源のcookieを持ってきて、異なるソースのcookie を持っていません**異なるソース:**フロントエンド設定withCredentialsをtrue、バックエンド設定Headerの方式ajaxに異なるソースのクッキー を自動的に持ち込む
サーバーのドメイン間リクエスト構成
定義#テイギ#
Cookie技術はHTTPプロトコルのインターネット上の急速な発展に由来する.インターネットの急速な発展に伴い、人々はより複雑なインターネットインタラクティブな活動を必要とし、サーバと活動状態を維持しなければならない.ユーザのニーズに応えるために,Cookie技術を含む種々のWebブラウズ状態を維持する手段が技術的に提案されている.
さぎょうげんり
クッキー構成
フィールド
さぎょう
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
})
パラメータの説明
クッキーのドメイン間での問題(ドメイン間リクエストでクッキーをどのように携帯するか)
の原因となる
ソリューション
// 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の携帯を要求
サーバーのドメイン間リクエスト構成
// ( 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");