天天看點

Cookie、Session

Cookie、Session

會話

**會話:**使用者打開一個浏覽器,點選了很多超連結,通路多個web資源,關閉浏覽器,這個過程可以稱為會話。

有狀态會話:

一個網站,怎麼證明你來過?

  • 用戶端 服務端
  1. 服務端給用戶端一個信件,用戶端下次通路服務端帶上信件即可;cookie
  2. 伺服器登記你來過,下次你來的時候進行比對;session

儲存會話的兩種技術

  1. cookie
  • 用戶端技術(響應,請求)(服務端傳給用戶端通過響應,用戶端傳給服務端通過請求)
  1. session
  • 伺服器技術,利用這個技術,可以儲存使用者的會話資訊,可以把資訊或者資料放在Session中!

常見場景:網站登入之後,你下次不用再登入,第二次直接登入上去

Cookie

  1. 從請求中拿到cookie
  2. 伺服器響應給用戶端cookie
Cookie[] cookies = req.getCookies();  //擷取cookie,伺服器端從用戶端擷取 req
cookie.getName() //獲得cookie中的key
cookie.getValue() //獲得cookie中的值 value
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");  //建立一個cookie
cookie.setMaxAge(24*60*60);    //cookie 有效期為一天  設定cookie的有效期
resp.addCookie(cookie);  //響應給用戶端 一個cookie      
package com.kk.servlet;

import javax.servlet.ServletException;
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.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;


//儲存使用者上一次通路的時間
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //伺服器  告訴你 來的時間  把這個世界封裝成功一個 信件  下次帶來,就知道你來了
        //解決中文亂碼
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //伺服器  向  用戶端回報的時候  需要用resp.getWriter();流向用戶端  輸出資料  (伺服器中的資料響應給用戶端 resp)
        PrintWriter out = resp.getWriter();

        //Cookie 伺服器端從用戶端擷取   使用request從用戶端中擷取Cookie
        //這裡傳回數組,說明cookie可能存在多個
        Cookie[] cookies = req.getCookies();

        //判斷cookie是否存在
        if (cookies!=null){
            //如果存在
            out.write("你上一次通路的時間是:");

            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];  //周遊數組 找到對應的值
                //擷取cookie的名字
                if (cookie.getName().equals("lastLoginTime")){
                    //擷取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());  //轉化為long的長整型
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }

            }

        }else{
            out.write("這是您第一次通路本站!");
        }

        //伺服器給用戶端響應一個cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
        cookie.setMaxAge(24*60*60);   //cookie 有效期為一天
        resp.addCookie(cookie);//使用resp   (伺服器響應給用戶端 resp)



    }
}      
<servlet>
    <servlet-name>CookieDemo01</servlet-name>
    <servlet-class>com.kk.servlet.CookieDemo01</servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>CookieDemo01</servlet-name>
        <url-pattern>/c1</url-pattern>
    </servlet-mapping>      

一個網站cookie是否存在上限!

  1. 一個Cookie隻能儲存一個資訊;
  2. 一個web站點可以給浏覽器發送多個cookie,最多存放20個Cookie;
  3. Cookie大小有限制 4kb;
  4. 300個Cookie浏覽器上限。

删除Cookie:

  1. 不設定有效期,關閉浏覽器,自動失效;
  2. 這是有效期時間為0.
package com.kk.servlet;

import javax.servlet.ServletException;
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.io.PrintWriter;
import java.util.Date;


//儲存使用者上一次通路的時間
public class CookieDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //建立一個cookie  名字必須要和删除的名字一緻
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
       //将cookie 有效期設定為0   立馬過期
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }
}      
<servlet>
    <servlet-name>CookieDemo02</servlet-name>
    <servlet-class>com.kk.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CookieDemo02</servlet-name>
    <url-pattern>/c2</url-pattern>
</servlet-mapping>      

中文資料傳遞:

package com.kk.servlet;

import javax.servlet.ServletException;
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.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;

//中文資料傳遞
public class CookieDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        PrintWriter out = resp.getWriter();
        //Cookie 伺服器端從用戶端擷取 req
        Cookie[] cookies = req.getCookies(); //這裡放回數組,說明cookie可能存在多個

        //判斷cookie是否存在
        if (cookies!=null){
            //如果存在
            out.write("你上一次通路的時間是:");
            //  for (Cookie cookie : cookies) {
            //
            // }
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //擷取cookie的名字
                if (cookie.getName().equals("name")){
                    System.out.println(cookie.getValue());
                    //解碼
                    out.write(URLEncoder.encode(cookie.getValue(),"utf-8"));
                }

            }

        }else{
            out.write("這是您第一次通路本站!");
        }

        //伺服器給用戶端響應一個cookie
        //編碼
        Cookie cookie = new Cookie("name", URLEncoder.encode("陳","utf-8"));
        //使用resp   (伺服器響應給用戶端 resp)
        resp.addCookie(cookie);
    }

}      
<servlet>
    <servlet-name>CookieDemo03</servlet-name>
    <servlet-class>com.kk.servlet.CookieDemo03</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CookieDemo03</servlet-name>
    <url-pattern>/c3</url-pattern>
</servlet-mapping>      

Session

什麼是Session?

  • 伺服器會給每一個使用者(浏覽器)建立一個Session對象;
  • 一個Session獨占一個浏覽器,隻要浏覽器沒有關閉,這個Session就存在;
  • 使用者登陸之後,整個網站都可以通路(儲存使用者的資訊等… …)

Session和Cookie的差別:

  • Cookie 是把使用者的資料寫給使用者的浏覽器,浏覽器儲存(可以儲存多個)
  • Session是把使用者的資料寫到使用者獨占Session中,伺服器端儲存(儲存重要的資訊,減少伺服器資源浪費)
  • Session對象由伺服器建立

使用場景:

  • 儲存一個登入使用者的資訊;
  • 購物車資訊;
  • 在整個網站中經常會使用的資料,我們将它儲存在Session中;

SessionDemo01

package com.kk.servlet;

import pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解決亂碼問題
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();

        //給Session中存東西
        session.setAttribute("name",new Person("陳",18));

        //擷取Session的ID
        String sessionId = session.getId();

        //判斷Session是不是新建立的
        if (session.isNew()){
            resp.getWriter().write("Session建立成功!,ID:"+sessionId);
        }else{
            resp.getWriter().write("Session已經在伺服器存在!,ID:"+sessionId);
        }

        //Session建立的時候做了什麼事情
//        Cookie cookie = new Cookie("JSESSIONID",sessionId);
//        resp.addCookie(cookie);
    }
}      

SessionDemo02

package com.kk.servlet;

import pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解決亂碼問題
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();

        Person person = (Person)session.getAttribute("name");
        System.out.println(person.toString());


    }
}      

SessionDemo03

package com.kk.servlet;

import pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //手動登出Session
        session.invalidate();//登出

    }
}      
package pojo;

public class Person {
    private  String name;
    private int age;

    public Person() {

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}      
<servlet>
        <servlet-name>SessionDemo01</servlet-name>
        <servlet-class>com.kk.servlet.SessionDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo01</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>SessionDemo02</servlet-name>
        <servlet-class>com.kk.servlet.SessionDemo02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo02</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SessionDemo03</servlet-name>
        <servlet-class>com.kk.servlet.SessionDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo03</servlet-name>
        <url-pattern>/s3</url-pattern>
    </servlet-mapping>

<!--設定Session預設的失效時間-->
    <session-config>
<!--15分鐘後Session失效(以分鐘為機關)-->
        <session-timeout>15</session-timeout>
    </session-config>