JAVAWEB-セッションテクノロジーCookie&Session、Cookie&Sessionの特定の使用法、Sessionオブジェクトの取得、Sessionライフサイクル

1.会話テクノロジーの紹介

1.1。クライアントの状態を保存します

ウェブサイトのショッピングシステムで、ユーザーは購入した製品情報をどこに保存しますか?Httpプロトコルはステートレスであるため、つまり、各クライアントがサーバー側のリソースにアクセスするとき、サーバーはクライアントが誰であるかを認識しません。したがって、クライアントの状態を識別するためにセッションテクノロジが必要です。会話技術はサーバーがクライアントのステータスを記憶できるようにします(クライアントを区別します)

2.2。会話型テクノロジー

特定のサイトでブラウザを開いてからブラウザを閉じるまでのプロセス全体がセッションになります。セッションテクノロジーは、このセッションでクライアントの状態とデータを記録することです。
会話技術が分かれているCookieSession

  • Cookie:データはクライアントにローカルに保存されるため、サーバーのストレージ負荷が軽減されます。セキュリティが不十分であり、クライアントはCookieをクリアできます。
  • Session:比較的良好なセキュリティでサーバー側にデータを保存し、サーバーへのプレッシャーを増大させます。

2.クッキーテクノロジー

たとえば、Taobaoの
ここに写真の説明を挿入
Webサイトにアクセスしています。グラフに、ブラウザを使用してショッピングWebサイトにアクセスし、ショッピングカートに物を追加すると、製品情報がブラウザに配置されることが示されています。ブラウザを閉じて再度アクセスすると、ショッピングカート内のアイテムは引き続き表示されます。

Cookieテクノロジーは、ユーザーデータをクライアントに保存するテクノロジーです。学習する2つの側面に分かれています。

まず、サーバーはどのようにしてCookieをクライアントに送信しますか。
次に、サーバーはクライアントによって運ばれるCookieをどのように受け入れますか。

次の2つの主要なポイントにつながります。

3つ目は、サーバーがクライアントにCookieを送信することです。

1.1。クッキーの作成:

  • Cookie cookie = new Cookie(String cookieName,String cookieValue);

例えば:

Cookie cookie = new Cookie("username""zhangsan");

次に、Cookieが応答ヘッダーの形式でクライアントに送信されます。
ここに写真の説明を挿入

注:中国語はCookieに保存できません

2.2。クライアントでのCookieの永続時間を設定します。

  • cookie.setMaxAge(int seconds); ここの括弧内の時間

例えば:

cookie.setMaxAge(10*60);

ブラウザのディスクファイルに10分間保存するCookie情報を設定すると、ブラウザは有効期限が切れるとCookie情報を自動的に削除します。

注:永続化時間が設定されていない場合、Cookieはブラウザのメモリに保存され、ブラウザはCookie情報の破棄(セッションレベルのCookie)を閉じます。永続化時間が設定されている場合、Cookie情報は時間の長さに応じてブラウザに永続化されます。ディスクファイル内。

3.3。Cookieの伝送パスを設定します。

  • cookie.setPath(String path);
    注:キャリーパスが設定されていない場合、Cookie情報は、Cookieを生成したWebリソースがアクセスされるパスでCookie情報をキャリーします。

例えば:

cookie.setPath("/WEB16");

Cookieを使用してWEB16アプリケーション内の任意のリソースへのアクセスを表します

cookie.setPath("/WEB16/cookieServlet");

cookie情報は、担当者がWEB16のcookieServletにアクセスしたときにのみ伝達されます。

4.4。クライアントにCookieを送信します。

  • response.addCookie(Cookie cookie);

5.5。クライアントのCookieを削除します。

クライアントの保存されているCookie情報を削除する場合は、永続時間0の同じ名前とパスのCookieで上書きしますできる

包括的なケース1:

@WebServlet(name = "SendCookieServlet",urlPatterns ="/SendCookieServlet")
public class SendCookieServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.创建Cookie对象
        Cookie cookie = new Cookie("name","zhangsan");
        //1.1 为Cookie设置持久化时间---Cookie信息在硬盘上保存的时间
        cookie.setMaxAge(60*10);//10分钟,时间设置为0代表删除该Cookie
        //1.2为Cookie设置携带路径
        cookie.setPath("/SendCookieServlet");//访问SendCookieServlet资源才携带Cookie
        cookie.setPath("/WEB16");//访问WEB16下的任何资源是都携带这个Cookie
        cookie.setPath("/");//访问服务器下的所有资源携带的Cookie
        //2.发送Cookie中存储的信息发的送到客户端====以响应头的形式
        response.addCookie(cookie);
    }
}

包括的なケース2:

(Cookieの削除)

@WebServlet(name = "RemoveCookieServlet",urlPatterns =
"/RemoveCookieServlet")
public class RemoveCookieServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            //删除客户端保存name=zhangsan的cookie信息
        Cookie cookie = new Cookie("name","");
            //将path设置成与要删除cookie的path一致
            cookie.setPath("/WEB16");
            //设置时间为0
            cookie.setMaxAge(0);
            response.addCookie(cookie);
    }
}

使用手順:この時点で「/ SendCookieServlet」にアクセスすると、name = zhangsanがCookieに保存され、「/ RemoveCookieServlet」にアクセスすると、キャッシュがクリアされ、MaxAge = 0に設定されます。index.jspにアクセスしましたが、Cookieが見つかりません。

4.サーバーはクライアントによって運ばれるCookieをどのように受け入れますか?

Cookie情報は、リクエストヘッダーの形式でサーバーに送信されます。したがって、サーバーがCookieを受け入れるための手順は次のとおりです。

  • 最初のステップ:リクエストを通じてすべてのCookieを取得します。
Cookie[] cookies = request.getCookies();
  • ステップ2:cookie配列をトラバースし、cookieの名前で必要なcookieを取得します
for(Cookie cookie : cookies){
    
    
if(cookie.getName().equal(cookieName)){
    
    
String cookieValue = cookie.getValue();
}
}

場合:

@WebServlet(name = "GetCookieServlet",urlPatterns =
"/GetCookieServlet")
public class GetCookieServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //获取客户端携带的cookie的数据
         Cookie cookies[] = request.getCookies();
         //通过cookie名称获取想要的Cookie
        for (Cookie cookie :cookies){
    
    
            //获得cookie的名称
            String cookieName = cookie.getName();
            if (cookieName.equals("name")){
    
    
                String cookieValue = cookie.getValue();
                System.out.println(cookieValue);
            }
        }
    }

5、セッションテクノロジー

セッションテクノロジーは、サーバー側にデータを保存するテクノロジーであり、クライアントごとにクライアントのデータを保存するためのメモリスペースを作成しますが、クライアントはサーバー内で独自のメモリスペースを見つけるために毎回IDを携帯する必要があります。そうセッションの実装はCookieに基づいていますセッションでは、Cookieを使用して顧客の一意のIDJSESSIONIDを保存する必要があります
ここに写真の説明を挿入
セッションでは、次の3つの質問を学ぶ必要があります。

このクライアントに属するセッションオブジェクト(メモリ領域)を取得するにはどうすればよいですか?

セッションからデータにアクセスする方法(セッションはドメインオブジェクトでもあります)?

セッションオブジェクトのライフサイクル?

1.1。Sessionオブジェクトを取得します

  • HttpSession session = request.getSession()
    このメソッドは、現在のセッション専用のSessionオブジェクトを取得します。サーバーにセッションのSessionオブジェクトがない場合は、新しいセッションを作成して返します。セッションに属するセッションが既に存在する場合は、既存のセッションを直接返します(基本的にJSESSIONIDに従って、クライアントがサーバー上にすでにセッションを持っているかどうかを判別します)。

ケースナンバーワン:

@WebServlet(name = "SessionServlet1",urlPatterns ="/SessionServlet1")
public class SessionServlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
   //创建属于该客户端(会话)的私有的session区域
   /*request.getSession()方法内部会判断 该客户端是否在服务器端已经存在session
 如果该客户端在此服务器不存在session,那么就会创建一个新的session对象
 如果该客户端在此服务器已经存在session 获得已经存在的session并返回*/
    HttpSession httpSession =  request.getSession();
    String id = httpSession.getId();//该session对象的编号id
       response.getWriter().write("JSESSIONID:"+id);
            System.out.println(id);
     }
}

効果は次のとおりです。
ここに写真の説明を挿入

2.2。セッションへのデータへのアクセス方法(セッションはドメインオブジェクトでもあります)

セッションはデータを格納するための地域オブジェクトでもあるため、セッションオブジェクトには次の3つのメソッドもあります。

  • session.setAttribute(String name,Object obj)
  • session.getAttribute(String name)
  • session.removeAttribute(String name)

ケース2:

ステップ1:SessionServlet1オブジェクトを作成する

@WebServlet(name = "SessionServlet1",urlPatterns =
"/SessionServlet1")
public class SessionServlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
  HttpSession httpSession =  request.getSession();
  httpSession.setAttribute("name","yjw");
  String id = httpSession.getId();//该session对象的编号id
         response.getWriter().write("JSESSIONID:"+id);
            System.out.println(id);
        }
}

ステップ2:SessionServlet2を作成する

@WebServlet(name = "SessionServlet2",urlPatterns = "/SessionServlet2")
public class SessionServlet2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //从session中获得存储数据
         HttpSession httpSession = request.getSession();
         String attribute =(String)httpSession.getAttribute("name");
         response.getWriter().write(attribute);
    }
}

効果は次のとおりです。
ここに写真の説明を挿入

3.3。Sessionオブジェクトのライフサイクル(インタビューの質問/筆記されたテストの質問)

Sessionオブジェクトのライフサイクル

  • 作成:request.getSession()が初めて実行されたときに作成されます
  • 破壊:
  1. サーバーが(異常に)シャットダウンしたとき
  2. セッションの有効期限が切れている/無効です(デフォルトは30分)
    注:時間の開始点は、サーバー側のリソースを操作していない状態から30分であり、プロジェクトのweb.xmlで構成できます。

次のように:

<session-config>
        <session-timeout>60</session-timeout>
</session-config>
  1. セッションを手動で破棄する
  • session.invalidate()

セッションスコープ:
デフォルトはセッション内です。つまり、セッション内のすべてのリソースがセッションオブジェクトを共有します。

インタビューの質問:ブラウザを閉じるとセッションが破棄されますか?-間違った
ブラウザはクライアントレベルにあり、セッションはサーバーレベルにあります

4.4。JSESSIONIDの永続性

考え:最初にアクセスするサーブレットによってCookieの形式で自動的に設定されたセッションは、クライアント側でのsetMaxAge()アクセスの期間を変更します。JSESSIONIDの永続性を実現するために。

@WebServlet(name = "SessionServlet1",urlPatterns =
"/SessionServlet1")
public class SessionServlet1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
HttpSession httpSession =  request.getSession();
String id = httpSession.getId();//该session对象的编号id
//手动创建一个存储JSESSIONID的Cookie为该Cookie设置持久化时间
 Cookie cookie = new Cookie("JSESSIONID",id);
        cookie.setPath("/WEB16");
        cookie.setMaxAge(60*10);//自行设置时间
        response.addCookie(cookie);         
        response.getWriter().write("JSESSIONID:"+id);
           System.out.println(id);
       }
}

おすすめ

転載: blog.csdn.net/Mr_GYF/article/details/109169158