ゴールドナインシルバーテンはこちら!あなたはクッキーとセッションの知識を知っている必要があり、インタビューで尋ねなければなりません!

序文

  1. セッション:セッションには複数のリクエストとレスポンスが含まれます
    注:セッションとは、ブラウザが初めてサーバーにリクエストを送信し、一方の当事者が切断するまでセッションが確立されることを意味します。
  2. 機能:セッション内の複数のリクエスト間でデータを共有する
  3. 方法:
    (1)クライアント側セッション技術:Cookie
    (2)サーバー側セッション技術:セッション

クッキー

  1. コンセプト:クライアントにデータを保存します。クライアントにCookieがあると、各リクエストがサーバーに送信されます
  2. 使用手順:
    (1)Cookieオブジェクトを作成し、パラメーター(キーと値のペア)にデータをバインドします
    new Cookie(String name、String value);
    (2)クライアントがサーバーにリクエストを送信した後、サーバーはCookieオブジェクトの
    レスポンスをクライアントに送信します。 addCookie(Cookie cookie);
    (3)クライアントがCookieを受信して​​リクエストを再送信した後、サーバーはクライアントからCookieオブジェクトを取得します
    Cookie [] request.getCookies();
    (4)サーバーがCookieオブジェクトを取得した後、 Cookieオブジェクトのデータを取得するgetNameおよびgetValueメソッド

コードのデモ:
このプロジェクトのCookie (1)Tomcat設定の使用手順をデモします

(2)srcの下にCookieTest1.javaを作成します

@WebServlet("/CookieTest1")
public class CookieTest1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1\. 创建Cookie对象,参数类似键值对
        Cookie cookie = new Cookie("msg", "hello");
        //2\. 客户端向浏览器发送Cookie
        response.addCookie(cookie);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

(3)srcの下にCookieTest2.javaを作成します

@WebServlet("/CookieTest2")
public class CookieTest2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //3\. 服务器获取Cookie对象
        Cookie[] cookies = request.getCookies();
        //4\. 服务器获取Cookie对象的值
        for (Cookie cookie :
                cookies) {
            String name = cookie.getName();
            String value = cookie.getValue();
            System.out.println("获得的Cookie对象的值:" + name + ":" + value);
        }
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

操作結果:
ブラウザのアドレスバーに最初に入力:http:// localhost:8080 / MyTest / CookieTest1、
次に入力:http:// localhost:8080 / MyTest / CookieTest2
コンソール出力:取得したCookieオブジェクトの値:msg:hello

  1. 上記のプログラムの原則:応答ヘッダーのset-cookieおよび要求ヘッダーのcookie実装に基づく

クッキーの詳細

1.一度に複数のCookieオブジェクトを送信し、応答を使用してaddCookieメソッドを複数回呼び出すことができます。

2.ブラウザでのCookieの保存時間:
(1)デフォルトでは、ブラウザが閉じられると、Cookieデータは破棄されます
(2)永続的な保存:
CookieオブジェクトのsetMaxAge(int seconds)メソッドを使用します:
a。正の数:Cookieデータを保存用にハードディスクに書き込みます。このパラメーターは、存続する秒数を指定します。タイムアップ後、データは無効になります。これは、ブラウザーが閉じられたときではなく、Cookieが作成された後のタイミングを指し
ます。b。負の数:デフォルト
c。ゼロ:Cookie情報を削除します

3. Tomcat 8以降、Cookieは中国語を保存できますが、特殊な漢字はまだサポートされていません。URLエンコード形式を使用することをお勧めします

4. Cookie共有の問題:
(1)複数のWebプロジェクトがTomcatサーバーにデプロイされているこれらのWebプロジェクトでCookieを共有する手順:
①デフォルトでは
Cookieを共有できません②Cookieは、CookieオブジェクトのsetPath(String path)メソッドを使用して設定されます取得範囲:
a。デフォルトでは、パラメーターはWebプロジェクトパスであり、このプロジェクトにのみアクセスでき、残りのプロジェクトにはアクセスできません
b。共有する場合は、パラメーターを "/"に設定できます(/ブラウザーによって解析されるアドレスはhttpです:// ip:port /)
(2)異なるTomcatサーバー間でCookieを共有するための手順:
CookieオブジェクトのsetDomain(String path)メソッドを使用し、パラメーターを第1レベルドメイン名に設定してから、同じ第1レベルドメイン名を持つ異なるサーバー間でCookie共有可能
例:setDomain( "。baidu.com")、tieba.baidu.comおよびnews.baidu.comのCookieを共有できます

クッキーの特徴と機能

1. Cookieはクライアントにデータを保存します。クライアントがCookieを取得すると、リクエストを送信するたびにCookieをサーバーに送信し
ます。2。ブラウザには、単一のCookie(4KB)のサイズと、同じドメイン名のCookieの総数に制限があります。制限(20)
3.機能:
(1)Cookieは一般に、安全性の低い少量のデータを格納するために使用されます
(2)Baiduアカウントにログインするための前提条件がない場合、サーバーはログインせずにクライアントを識別できますバイドゥを開いて、検索時にプロンプ​​トを表示しないように検索エンジンを設定します。今後ブラウザを開いてバイドゥにアクセスすると、検索プロンプトボックスが表示されなくなります。原則:バイドゥサーバーは、設定されたCookie情報をブラウザに保存します。次にバイドゥにアクセスすると、バイドゥサーバーブラウザのCookieを取得し、Cookieの値に応じてプロンプトボックスを表示するかどうかを決定します

Cookieのケース:最後の訪問の時刻を記録する

  1. 要件:サーブレットプログラムにアクセスする:
    (1)初回の訪問の場合、プロンプト:こんにちは、
    初回の訪問へようこそ(2)初回の訪問でない場合、プロンプト:おかえり、前回の訪問の時間は次のとおりでした:xxxx
  2. 分析:
    Cookieを使用して完了します。サーバーは、クライアントにlastTime
    (1)という名前のCookieオブジェクトがあるかどうかを判断します
    はい、最初の訪問ではありません):①ブラウザに表示:おかえりなさい、最後の訪問の時間:xxxx
    ②現在の時刻をlastTimeという名前のCookieに書き戻します
    (2)いいえ、初めての訪問です:
    ①ブラウザに表示:こんにちは、初めての訪問へ
    ようこそ②現在の時刻をlastTimeという名前のCookieに書き戻します

コードのデモ:jspページを使用してこのケースを完了する

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>CookieTest</title>
</head>
<body>
    <%-- jsp页面通过首行的page标签自动的设置响应的格式,所以向浏览器输出数据不会乱码 --%>
    <%
        //1\. 服务器获取客户端的所有cookie
        Cookie[] cookies = request.getCookies();
        //2\. 获取的cookie不一定含有lastTime,用一个布尔类型判断
        boolean flag = false;
                //3\. 遍历cookie数组,判断是否有lastTime
        if(cookies != null && cookies.length > 0) {
            for (Cookie cookie :
                    cookies) {
                String cookieName = cookie.getName();
                if ("lastTime".equals(cookieName)) {
                    // 有lastTime,不是第一次访问
                    flag = true;
                    // 将现在的时间写回lastTime的cookie中
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String format = sdf.format(date);
                    // 防止乱码,向cookie对象中保存的中文数据使用URL编码
                    format = URLEncoder.encode(format, "UTF-8");
                    // 向名为lastTime的cookie中保存此时间
                    cookie.setValue(format);
                    // 设置cookie的存活时间
                    cookie.setMaxAge(60 * 60 * 24 * 30); //一个月
                    // 将cookie写回客户端
                    response.addCookie(cookie);
                    // 获取此cookie的value时间值,用于写出时间到浏览器
                    String cookieValue = cookie.getValue();
                    cookieValue = URLDecoder.decode(cookieValue, "UTF-8");
                    out.write("欢迎回来,您上次的访问时间是:" + cookieValue);
                    break; //找到了需要的cookie,就不需要判断别的cookie了
                }
            }
        }
    %>
    <%
        if(cookies == null || cookies.length == 0 || flag == false) {
            // 没有lastTime,第一次访问,将当前时间保存至cookie,向客户端传递此cookie
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String format = sdf.format(date);
            format = URLEncoder.encode(format, "UTF-8");
            Cookie cookie = new Cookie("lastTime", format);
            cookie.setMaxAge(60 * 60 * 24 * 30);
            response.addCookie(cookie);
            out.write("您好,欢迎您首次访问");
        }
    %>
</body>
</html>

セッションの紹介

  1. 概念:セッションはサーバー側のセッションテクノロジーであり、セッション内の複数のリクエスト間でデータを共有し、サーバー側にデータを保存します。ユーザーがログインした後に情報を保存するためによく使用されます
  2. クイックスタート:
    (1)HttpSessionオブジェクトを取得するHttpSession
    session = request.getSession();
    注:①最初の呼び出しはセッションセッションを作成することを意味します
    ②以降の呼び出しは以前に作成したセッションセッションオブジェクトを取得することです
    (2)HttpSessionオブジェクトを使用する方法
    void setAttribute(String name、Object value);
    Object getAttribute(String name);
    void removeAttribute(String name);

コードのデモ:セッションの使用例
(1)srcの下にSessionDemo1.javaを作成します。

@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1\. 创建Session会话
        HttpSession session = request.getSession();
        //2\. 存储数据
        session.setAttribute("msg", "Hello! Session!");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

(2)srcの下にSessionDemo2.javaを作成します。

@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1\. 获取Session
        HttpSession session = request.getSession();
        //2\. 获取数据
        Object msg = session.getAttribute("msg");
        System.out.println(msg);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

操作結果:
最初にブラウザーのアドレスバーにhttp:// localhost:8080 / MyTest / SessionDemo1と
入力し次に次のように入力します。http:// localhost:8080 / MyTest / SessionDemo2
コンソールの出力:Hello!Session!

  1. 上記のプログラムの原則:セッションの最下層はCookieに基づいて実装されています

    注:各セッションセッションには識別子として一意のid値があり、getIdメソッドはこのid値を取得できます

セッション詳細

  1. セッションが破棄される方法
    (1)サーバーが閉じられる
    (2)セッションオブジェクトがinvalidate()を呼び出す
    (3)セッションのデフォルトの有効期限:30分、web.xmlの構成ファイルを変更してデフォルトの有効期限を変更できます

     <session-config>
         <session-timeout>30</session-timeout>
     </session-config>
    
    
  2. クライアントを閉じた後、サーバーはシャットダウンしません。同じセッションが2回取得されますか?
    (1)デフォルトでは、いいえ、Cookieは消え、その中のセッションは自然に消えます
    (2)同じものが必要な場合は、次のようにします。

  3. クライアントが閉じられていない場合、サーバーが閉じられた後、同じセッションが2回取得されますか?
    同じセッションではありませんが、データが失われないようにするために、Tomcatサーバーは自動的に完了します:
    (1)セッションのパッシベーション:
    サーバーが正常にシャットダウンする前に、Sessionオブジェクトがハードディスクにシリアル化されます
    (2)セッションのアクティベーション:
    サーバーが起動しますその後、セッションファイルをメモリ内のセッションオブジェクトに逆シリアル化します。
    注:つまり、取得が同じセッションでなくても、セッション内のデータは同じです

  4. セッションの機能
    (1)セッションは、セッションの複数の要求データを格納するために使用され、サーバー側に存在し、セッションにはセッションオブジェクトが1つしかありません
    (2)セッションは任意のタイプとサイズのデータ​​を格納できます

  5. セッションとCookieの違い:
    (1)セッションはサーバー側にデータを格納し、クライアント側はCookie
    (2)セッションにはデータサイズの制限がなく、Cookieには(4KB)があります
    (3)セッションデータは安全で、Cookieは比較的安全ではありません

Cookieケース:ユーザー名なしでログイン

注:正常にログインした後、ブラウザーを再始動すると、再度ログインすると、ブラウザーは前回ログインしたユーザー名を記憶しています。

コードのデモ:ログインフリーのユーザー名の使用
(1)create login.jsp

<body>
    <form action="http://localhost:8080/MyTest/LoginServlet" method="post">
        用户名:<input type="text" name="username" value="${cookie.username.value}"> <br>
        密码:<input type="password" name="password"> <br>
        <input type="submit" value="登录">
    </form>
</body>

(2)LoginServlet.javaを作成する

public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //设置正确的用户名为周杰伦,密码是123
        if ("jay".equals(username) && "123".equals(password)) {
            Cookie cookie = new Cookie("username", username);
            cookie.setMaxAge(60 * 60 * 24 * 7); //cookie保存一周
            response.addCookie(cookie);
            System.out.println("登陆成功!");
        } else {
            System.out.println("登陆失败!");
        }
    }
}

操作結果:
正しいユーザー名とパスワードを使用した、再度ログインページにアクセスすると、ユーザー名入力ボックスに自動的にジェイが入力されます

Cookieを表示するGoogle Chrome

確認コードの基本原理

Google画像確認コードの使用

Google確認コードを使用する手順:

  1. Google確認コードのjarパッケージをインポートします。
  2. web.xmlで次の構成を実行します(同じように記述します)。
<servlet>
    <servlet-name>KaptchaServlet</servlet-name>
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>KaptchaServlet</servlet-name>
    <url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>

注:代表访问这个Servlet就会生成验证码及图片,并将此验证码保存到Session域中,每次访问都会生成不同的验证码

  1. imgタグを使用して、確認コードをフォームに表示します
<body>
    <form action="http://localhost:8080/MyTest/Servlet">
        验证码:<input type="text" style="width: 80px;" name="code">
        <img src="http://localhost:8080/MyTest/kaptcha.jpg" alt="验证码没有找到"
             style="width: 100px; height: 28px;" id="code_img"> <br>
        <input type="submit" value="登录">
    </form>
</body>

  1. 取得した確認コードをサーバーで処理する
public class Servlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Session中的验证码
        String attribute = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
        //删除Session中的验证码
        request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
        //获取用户输入的验证码
        String code = request.getParameter("code");
        if (attribute.equalsIgnoreCase(code)) {
            System.out.println("验证码正确!");
        } else {
            System.out.println("验证码错误!");
        }
    }
}

演算結果:

画像をクリックして確認コードを切り替えます

コードのデモ:上記の確認コードのクリックイベントをバインドします(スクリプトタグを使用)

window.onload = function () {
    //通过验证码图片的id属性值绑定单击事件
    var elementById = document.getElementById("code_img");
    elementById.onclick = function () {
        //1\. 事件响应的function函数中的this对象是当前正在响应事件的标签的dom对象
        //2\. src属性可读可写
        this.src = "http://localhost:8080/MyTest/kaptcha.jpg?d=" + new Date();
    }
} 

操作結果:確認コードの画像をクリックするたびに、新しい確認コードになり、セッションドメインに新しい確認コードを保存します

やっと

こちらをご覧いただきありがとうございます。読んだ後、ご不明な点がありましたらコメント欄でお尋ねください。記事が役に立ったと思われる場合は、高く評価してください。Java関連の技術記事や業界情報を毎日共有します。記事を転送してください!

おすすめ

転載: blog.csdn.net/weixin_47277170/article/details/108278476
おすすめ