javaweb-Cookie&Session-35

アイデアコードテンプレートを変更する

ここに写真の説明を挿入

会話型テクノロジー

1. 会话:一次会话中包含多次请求和响应。
	* 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2. 功能:在一次会话的范围内的多次请求间,共享数据
3. 方式:
	1. 客户端会话技术:Cookie
	2. 服务器端会话技术:Session

クッキー:

1. 概念:客户端会话技术,将数据保存到客户端

2. 快速入门:
3. 实现过程:客户端申请,服务器响应,数据存储在本地,下次访问将存储在本地的数据一并发送过去,实现多次请求响应的数据共享,服务器发送和接收cookie
	* 使用步骤:
		1. 创建Cookie对象,绑定数据
			* new Cookie(String name, String value) 
		2. 发送Cookie对象
			* response.addCookie(Cookie cookie) 
		3. 获取Cookie,拿到数据
			* Cookie[]  request.getCookies()  

スーパー使用時に間違えましたか?
カプセル化されたクッキー

package learn.myweb;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//使用注解可以更加简便。其中有默认参数,例如loadstarup
@WebServlet("/head_easy")
//可以更加简化,将url省略掉,使用value就可以,进一步value也不用写
public class servlet_test extends HttpServlet {
    
    


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("head_easy类");

        System.out.println("dopost类");
//        获得cookie
        Cookie[] cookies = req.getCookies();
        if(cookies!=null){
    
    
            for(Cookie c:cookies){
    
    
                String cName = c.getName();
                String cValue = c.getValue();
                System.out.println(cName+cValue);
            }
        }
        else{
    
    

   System.out.println("cookie是空的");
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("head_easy类");
        System.out.println("doget类");
        this.doPost(req,resp);
    }
}

クッキーを解釈する

package learn.myweb;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//使用注解可以更加简便。其中有默认参数,例如loadstarup
@WebServlet("/head_easy")
//可以更加简化,将url省略掉,使用value就可以,进一步value也不用写
public class servlet_test extends HttpServlet {
    
    


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("head_easy类");

        System.out.println("dopost类");
//        获得cookie
        Cookie[] cookies = req.getCookies();
        if(cookies!=null){
    
    
            for(Cookie c:cookies){
    
    
                String cName = c.getName();
                String cValue = c.getValue();
                System.out.println(cName+cValue);
            }
        }
        else{
    
    

   System.out.println("cookie是空的");
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("head_easy类");
        System.out.println("doget类");
        this.doPost(req,resp);
    }
}

同じブラウザにキャッシュがある場合、同じでない場合は空になります。3
。実装の原則
*応答ヘッダーセットCookieと要求ヘッダーCookieの実装に基づく
*プロトコルの制約に従い、データは応答ヘッダーが認識されたときにローカルに保存され、次の送信で運ばれます。データ、
ここに写真の説明を挿入

ここに写真の説明を挿入

ここに写真の説明を挿入
1つのWebサーバーに複数のWebプロジェクトを展開する

ここに写真の説明を挿入

ここに写真の説明を挿入
4.クッキーの詳細

  1. 一度に複数のCookie
    送信できますか?*はい
    *複数のCookieオブジェクトを作成し、応答を使用してaddCookieメソッドを複数回呼び出してCookieを送信できます。
    2. Cookieはブラウザにどのくらいの期間保存されますか?
    1.デフォルトでは、ブラウザを閉じるとCookieデータが破棄されます。つまり、この時点でCookieはブラウザのメモリに存在し、閉じると解放されます
    。2。永続ストレージ:
    * setMaxAge(int seconds)
    1。正の数:Cookieを設定しますデータはハードディスク上のファイルに書き込まれます。永続的なストレージ。また、Cookieの存続時間を指定します。時間が経過すると、Cookieファイルは自動的に無効になります。ブラウザを閉じてから30秒以内でも有効で、ウェブサイトログインの有効期間を示します
    。cookie.setxxx(0)を閉じてからログインすると便利です。3
    。負の数:デフォルト値、メモリ内
    4.ゼロ:Cookie情報を削除し、Cookieはメモリとハードディスクにありません。サーバーはクライアントコンピューターの情報を直接操作することはできません。このようにクライアントコンピューターのCookieを操作することにより、
    Cookieの有効期間内にクリアされます。3。Cookieは中国語で保存できますか?
    * tomcat 8より前では、中国語のデータをCookieに直接保存することはできません。
    *中国語のデータはトランスコーディングする必要があります-通常はURLエンコード(%E3)
    * tomcat 8以降、Cookieは中国語のデータをサポートします。特殊文字はまだサポートされていません。URLエンコーディングストレージ、URLデコード分析を使用することをお勧めします
    。4。Cookieの複数アイテムの共有の問題?
    1.複数のWebプロジェクトがtomcatサーバーにデプロイされていると仮定すると、これらのWebプロジェクト間でCookieを共有できますか?
    *デフォルトではCookieを共有できません

     		* setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录。统一服务器的不同项目有共享数据的需求
     			* 如果要共享,则可以将path设置为"/"
    
     	
     	2. 不同的tomcat服务器间cookie共享问题?
     	3. 由于项目过大,分支过多,如果将资源部署在同一服务器上,那么服务器无法支持,因此多台服务器之间也有共享数据需求
     		* setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
     			* setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
    

  2. Cookieの特徴と機能
    1.Cookieはクライアントブラウザにデータを保存し、データは改ざんされたり失われたりしやすいです。2。ブラウザには単一のCookieのサイズ(4kb)に制限があり、同じドメイン名のCookieの総数(20)にも制限があります。 )
    *機能:
    1。Cookieは通常、機密性の低い少量のデータを保存するために使用されます
    。2。ログインせずにサーバーによるクライアントの識別を完了するため。

  3. ケース:最後の訪問の時刻を覚えておいてください
    。1。要件:
    1。サーブレットにアクセスします。最初の訪問の場合は、次のプロンプトが表示されます。こんにちは。最初の訪問を歓迎します。
    2.最初の訪問でない場合、プロンプト:ようこそ、最後の訪問の時刻は次のとおりです。表示時間文字列は
    、特定の名前のCookieが存在するかどうかを判断するために、Cookieを使用して実現されます。存在する場合は、時間が取り出され、時刻が更新されてバックスローガンが表示されます。存在しない場合は、ウェルカムスローガンを表示するために作成され、時間内に配置さ
    れますが、スペースなどのCookie内の特殊文字は表示をサポートしていないため、特殊文字にはurlencoderエンコーディングを使用する必要があります。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/Test01_01")
public class Test01_01 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        System.out.println("01-01-dopostt");
//        Cookie msg = new Cookie("MSG", "hello");
//        msg.setPath("/");
//        response.addCookie(msg);
//        回复消息有中文,因此加上响应头
        response.setContentType("text/html;charset=utf-8");
//        获得所有的cookie
        Cookie[] cookies = request.getCookies();
        Boolean exit=false;
//        遍历所有的cookie,为什么要判断cookie长度
        if(cookies!=null && cookies.length>0){
    
    
            for(Cookie c:cookies){
    
    
//                如果有特定的cookie名字出现
                if(c.getName().equals("last_time")){
    
    
                    exit=true;
//                    返回上次的登录时间,为什么要使用url与解码,特殊字符?是空格一类
                    String decoded_time = URLDecoder.decode(c.getValue(), "utf-8");
                    response.getWriter().write("<h1>"+"欢迎回来"+decoded_time+"<h1>");
//                    将当前时间值更新进入cookie中
                    Date date = new Date();
//                    重新设定date显示格式,其默认为美国格式
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String formated_date = dateFormat.format(date);
//                    将当前时间编码后存储
                    String encode_date = URLEncoder.encode(formated_date, "utf-8");
                    c.setValue(encode_date);
//                    设置cookie存活时间
                    c.setMaxAge(24*60*60);
                    response.addCookie(c);

                }
                else{
    
    
//                    response.getWriter().write("有cookieda都不符合条件");

                }
//                找到就推出循环

                break;
            }
        }
//        判断需要的文件是否存在,如果不存在就创建

        if(cookies==null || cookies.length==0 || exit==false){
    
    
            //                    将当前时间值更新进入cookie中
            Date date = new Date();
//                    重新设定date显示格式,其默认为美国格式
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年mm月dd日 HH:mm:ss");
            String formated_date = dateFormat.format(date);
//                    将当前时间编码后存储
            String encode_date = URLEncoder.encode(formated_date, "utf-8");
            Cookie c = new Cookie("last_time", encode_date);
//                    设置cookie存活时间
            c.setMaxAge(24*60*60);
            response.addCookie(c);
            response.getWriter().write("您首次登录");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("01-01-doget");
        this.doPost(request, response);
    }
}

JSP:はじめに

1. 概念:
	* Java Server Pages: java服务器端页面
		* 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
		* 用于简化书写,将java与html结合在一起


2. 原理
	* JSP本质上就是一个Servlet

ここに写真の説明を挿入
このフォルダに設定すると、workの下のインデックスがclassになり、workは実行時に生成されたリソースファイル
ここに写真の説明を挿入
jsp-java-httpJspBase内部クラスを格納し、-httpserverlet
サービスメソッドは基本的なhtml要素を出力し、簡単に呼び出せるようにpage要素をカプセル化します。インタプリタをアタッチするのと同じで、
3の記述が簡単になります。JSPスクリプト:JSPはJavaコード
1の方法を定義します。<%code%>:サービスメソッドで定義されたJavaコード。serviceメソッドで定義できるもの、スクリプトで定義できるもの、ローカル変数を定義するもの、およびスコープが小さいもの。
2. <%!コード%>:jsp変換後のjavaクラスのメンバー位置である定義済みのjavaコードは、メンバー変数の一種です。一緒に記述してみませんか?一般的には使用されませんが、アクションの範囲は比較的広いです。
3. <%= Code%>:定義されたJavaコードがページに出力されます。出力ステートメントで定義できるもの、スクリプトで定義できるもの、ページ出力ステートメント。

4. JSP的内置对象:
	* 在jsp页面中不需要获取和创建,可以直接使用的对象,因为这些方法后来解释的时候都会放到service中执行,service中resp,req可以识别这些方法
	* jsp一共有9个内置对象。
	* 今天学习3个:
		* request
		* response
		* out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
			* response.getWriter()和out.write()的区别:
				* 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
				* response.getWriter()数据输出永远在out.write()之前,就是response无论定义在哪里,都输出在out之前
				* 因此建议使用out,不至于突然打乱布局,out顺序输出

コードの切り捨て、セグメントでの制御と表示を記述
できます利点:サーバーを再起動せずにJSPを時間内に更新できます

セッション:

1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
也是域对象,类似context,一次会话
3. 快速入门:
	1. 获取HttpSession对象:
		HttpSession session = request.getSession();
	2. 使用HttpSession对象:
		Object getAttribute(String name)  
		void setAttribute(String name, Object value)
		void removeAttribute(String name)  

4. 原理
	* Session的实现是依赖于Cookie的。
	* 就是服务器创建一个session,指定唯一id,浏览器申请资源的时候将cookieID响应,反馈数据,后来浏览器访问其他资源携带这个cookieID,服务器会根据这个ID找到内部的数据,反馈,安全性高,内存消耗
  1. 詳細:
    1。クライアントが閉じられているとき、サーバーは閉じられていません。同じセッションが2回取得されていますか?
    *デフォルトで。そうではありません。セッションが終了したら、セッションを印刷してIDを別の方法で印刷できます
    *
    *同じものが必要な場合は、Cookieを作成し、キーはJSESSIONIDで、最大存続時間を設定し、Cookieを永続化できます。
    Cookie c = new Cookie( "JSESSIONID"、session.getId());
    c.setMaxAge(60 * 60);
    response.addCookie©;

     2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
     	* 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作,比如用户购物期间服务器重启,应当保证之前用户的数据不丢失,便于接下来的操作
     		* session的钝化:
     			* 在服务器正常关闭之前,将session对象系列化到硬盘上
     		* session的活化:
     			* 在服务器启动后,将session文件转化为内存中的session对象即可。
     		idea不活化,原因?钝化成功,将session.ser存储但是活化失败,因为当项目重启后,会将work目录删掉,导致之前的钝化无用,无法恢复数据
     		先找到本地项目-out目录(部署的项目,打包war)-找到tomcat目录下webapps,放入识别,开启(被解压)-
     		服务器开启,访问-需要是打包的名字+资源名代表实际路径,不再是虚拟路径
     		同tocmat目录下work目录运行时动态资源,比如jsp-java,session被序列化的文件也存储,这里服务器正常关闭后会将文件放入目录内,session.ser,当下次开启服务器,会自动读取session.ser,方便。
     		未来开发不在idea中部署,而是扔到webapps中居多,保证了钝化的work不会被轻易删除
     3. session什么时候被销毁?
     	1. 服务器关闭
     	2. session对象调用invalidate() 。
     	3. session默认失效时间 30分钟,这就是一些网站30分钟重新登录的原因
     	可在tomcat的conf中web.xml中修改默认配置
     		选择性配置修改	
     		<session-config>
     	        <session-timeout>30</session-timeout>
     	    </session-config>
    
    1. セッションの特徴

      1. セッションは、セッションに対する複数の要求のデータを格納するために使用され、サーバー側に格納されます
      2. セッションには、任意のタイプとサイズのデータ​​を保存できます
      • セッションとCookieの違い:
        1. セッションはサーバー側にデータを保存し、クライアント側にCookieを保存します
        2. セッションにはデータサイズの制限はありません。Cookieには
        3. セッションデータは安全です。安全でない
          jspと比較して、Cookieをブラウザで直接使用することはできません。サーバーを使用してください

文字列
が等しいかどうかを比較するときは、変数が空であることを考慮する必要があります。最良の方法は、str.equalsです。これにより、equalsを呼び出すことが空ではないことが保証されます。すべての変数が変数である場合は、&&を使用して最初にnullに等しいかどうかを判断できます。

検証コードのロジックの問題は1回限りであり、使い切ると無効になります。そうでない場合、ログインチェックは無効になります。

おすすめ

転載: blog.csdn.net/lidashent/article/details/107761208