目次
前回のブログではリクエストとレスポンスについての学習を共有しましたが、今日はクッキーとセッションについての学習を紹介します。
クッキーとセッションは一種の会話技術ですが、会話技術とは何ですか?日常生活では、電話をかけてから電話を切るまでの質問と回答のプロセスは会話です。B/ Sアーキテクチャでは、セッションは、ブラウザが最初にサーバーにリクエストを送信してから、一方のパーティが切断してセッションが終了するまで確立されます。この場合も、セッションには複数のリクエストが含まれています。
cookie:ブラウザ側のセッションテクノロジー(データはブラウザに保存されます)
セッション:サーバー側のセッションテクノロジー(データはサーバーに保存されます)
クッキー
Cookieは、生成されたデータをブラウザ側に保存し、サーバー側で作成します。これはキー/値の形式です。応答を通じてブラウザに書き込まれます。次のリクエストは、ルールに従ってCookieをサーバーに送信するために使用されます。
実行の原則:
関連する方法:
コンストラクタ:
新しいCookie(文字列名、文字列値)
ブラウザメソッドに書き戻します。
response.addCookie(Cookie c)
クッキーを入手する:
request.getCookies()
cookieメソッド:
-----> getName():Cookieの名前を取得します
-----> getValue():Cookieの値を取得します
注意:
1)応答Cookieは、set-cookieの応答ヘッダーを介してブラウザーに戻されます。
2)要求されたCookieは、Cookie要求ヘッダーを介してサーバーに送信されます。
コードケース:
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//有数据产生 需要被保存
Cookie cookie = new Cookie("ds" , "James");
//保存数据 将cookie交给响应对象 响应给了浏览器
response.addCookie( cookie );
}
}
public class TwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据请求获得cookie数据
Cookie[] cookies = request.getCookies();
//判断cookie
if(cookies != null){
//遍历
for (Cookie cookie : cookies) {
//获得cookie的名称 和 cookie值部分
System.out.println(cookie.getName() +"====" + cookie.getValue());
}
}else{
System.out.println("暂时还没有获取到cookie的信息");
}
}
}
セッションレベルのCookie:ブラウザがサーバーを開いてブラウザが閉じると、セッション中のデータがセッションの終了時に保存され、Cookieが消えます。
API
メソッド名 | 効果 |
---|---|
setMaxAge(int seconds) | ブラウザでCookieの有効期間を設定し、Cookieの永続性レベルを設定します |
setPath( "Path") | Cookieパスを設定し、ページにアクセスしたときに伝送されるCookieを指定しますsetPath( "/") |
setMaxAge(int seconds)
- 正の整数の場合は、指定した生存時間を設定します
- 負の場合、ブラウザを閉じるとCookieが破棄されます
- 0の場合、このCookieをすぐに破棄します(パスは一貫しています)
public class OneAPIServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//有数据产生 需要被保存
Cookie cookie = new Cookie("dzd" , "小强3333");
//设置cookie的存活时间(1天)
cookie.setMaxAge(60 * 60 * 24 * 7);//单位秒
}
}
パスの設定の問題:
1. Cookieのデフォルトのパスは、アクセスされたサーブレットのパスです。プロジェクトのアプリケーションパスから始まり、最後の「/」で終わります。
例:アクセスパスは「/ day08_cookie / demo01」、Cookieのデフォルトパスは/ day08_cookieです。
アクセスパスは「/ day08_cookie / a / demo1」で、Cookieのデフォルトパスは/ day08_cookie / aです。
2.このCookieパスを含むURLにアクセスすると、このCookieが運ばれます。含まれていない場合は、運ばれません。
例:{次の3つのパス}:
cookie1のパス:/ day08_cookie / a / b
cookie2のパス:/ day08_cookie / a
cookie3のパス:/ day08_cookie
次のパスにアクセスすると、運ばれるCookieの数が異なります。
- アクセスパスがhttp:// localhost / day08_cookie / a / b / 1.htmlの場合、3つのCookieが伝送されます
- アクセス・パスがあるときのhttp://localhost/day08_cookie/a/1.html、クッキー2と3がされ運ば
- アクセスパスはhttp://localhost/day08_cookie/1.html時間で、最初の3つのCookiEを伝送します
クッキーの特徴:
- ブラウザの次の名前とパスで判別できるCookieは1つだけです。同じ名前のCookieが書き戻されると、前のCookieが上書きされます。
- 名前またはパスが不合理な場合、Cookieは同時に存在する可能性があります
- クッキーをクロスブラウザにすることはできません
- cookie値は中国語(tomcat8)で保存できますが、スペース「、」および「;」は保存できません。
- これらの特殊な記号がある場合は、最初に値をエンコードし、値を取得した後で指定されたエンコードをデコードする必要があります。
- エンコードするときは、URLEncode.encode( "エンコードする文字列"、 "utf-8")を使用することをお勧めします
- デコードするときは、URLDecode.decode( "デコードする文字列"、 "UTF-8")を使用することをお勧めします
public class TeShu_Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String s = "我爱你,中 国;";
//编码
String s_8 = URLEncoder.encode(s, "utf-8");
Cookie cookie = new Cookie("demo1", s_8);
response.addCookie(cookie);
//第一次获取不到此cookie的,但是第一次之后再访问就可以获取了
Cookie[] cookies = request.getCookies();
if (cookies!=null&&cookies.length>0) {
for (Cookie c : cookies) {
if ("demo1".equals(c.getName())) {
String value = c.getValue();
//解码
value = URLDecoder.decode(value,"utf-8");
System.out.println(value);
}
}
}
}
}
セッション
サーバー側のセッションテクノロジー:セッション内の複数のリクエスト間でデータを共有し、データをサーバー側に保存します
作業過程:
ブラウザがサーバーにアクセスすると、サーバーはブラウザがID(JSESSIONID)を持っているかどうかを確認します。
そうでない場合、サーバーはサーバー上にスペースを作成してからデータを操作し、サーバーはそれに応じてこのコントロールのID(JSESSIONID)をブラウザーに返します。
運ばれる場合、サーバーはIDを取得し、IDを使用して、メモリにこのスペースがあるかどうかを確認します(存在する場合、データはこのコントロールに直接保存されます。見つからない場合、サーバーはサーバー上にスペースを作成し、データを操作し、サーバーを操作します。このスペースのID(JSESSIONID)は、応答としてブラウザーに返されます)
基本的な使用法:
一般的な方法:
setAttribute(String key、Object value)属性値を設定します
getAttribute(String key)属性値を取得します
removeAttribute(String key)属性値を削除します
実行の原則:
コードケース:
public class SessionOneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得session(第一次调用会创建session对象)
HttpSession session = request.getSession();
System.out.println(session);
System.out.println(session.getId());//手动获得session的id
System.out.println(session.isNew());//是不是新创建的
session.setAttribute("ds","James");
}
}
public class SessionTwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得session(第一次调用会创建session对象)
HttpSession session = request.getSession();
System.out.println(session);
System.out.println(session.getId());//手动获得session的id
System.out.println(session.isNew());//是不是新创建的
System.out.println( session.getAttribute("ds") );
}
}
セッションのライフサイクル:
作成:デフォルトでは、reqeust.getSession()への最初のアクセスで作成されます
破壊:
- デフォルトのtomcatサーバーでは、30分以上で破棄されます(30分以内に操作がない場合、セッションは自動的に破棄されます)
- 破棄するためにinvalidateメソッドを手動で呼び出します
- サーバーが異常にシャットダウンした場合(クラッシュ、ブルースクリーン)、サーバーを破壊します
サーバーは正常にシャットダウンします。メモリ内のセッションデータがローカルディスク(作業中のセッションファイル内)にシリアル化され、サーバーが再起動されてセッションファイルがメモリにロードされ、データがロードされてデータが消えることはありません。
クッキーとセッションの概要:
- Cookie:データストレージが再びブラウザに表示され、Cookieに保存されているデータが優先され、Cookieは安全ではありません
- セッション:データはサーバーに保存され、セッションは無制限のデータを保存します(サーバーのサイズに応じて、セッションは比較的安全です)