060_Cookie/Session


會話

用戶打開一個瀏覽器到關閉瀏覽器,這個過程能夠稱之爲會話。html

有狀態會話

客戶端再次訪問服務端時,服務端知道客戶端曾經來過,稱之爲有狀態會話。java

保存會話的兩種技術

  • 客戶端技術(響應,請求)

session

  • 服務端技術,利用這個技術,能夠保存用戶的會話信息,咱們能夠把信息或數據放在session中

常見場景

  • 網站登陸後,下次訪問不須要登陸

Cookie

  1. 服務端響應給客戶端cookie
  2. 服務端從客戶端請求中拿到cookie
Cookie[] cookies = req.getCookies();//獲取cookie
cookie.getName();//獲取cookie的key
cookie.getValue();//獲取cookie的value
Cookie cookie = new Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis()));//新建cookie
cookie.setMaxAge(24*60*60);//設置cookie有效期設置爲1天
resp.addCookie(cookie);//響應給客戶端一個cookie
  1. cookie通常會保存在本地的用戶目錄下的appData目錄下

image.png

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.qing</groupId>
  <artifactId>javaweb-cookie-session</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
    </dependency>
  </dependencies>
</project>
package com.qing.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 CookieDemo01 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");

        PrintWriter out = resp.getWriter();

        //Cookie,服務端從客戶端獲取
        Cookie[] cookies = req.getCookies();//這裏返回數組,說明cookie可能存在多個
        //判斷cookie是否存在,第一次訪問服務器時,不存在,cookie是由服務器給客戶端的
        if (cookies == null || cookies.length < 1) {
            out.write("這是您第一次訪問本站");
        } else {
            //若是存在,讀取cookie,獲取cookie中的值
            boolean flag = true;
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if ("lastLoginTime".equals(cookie.getName())) {
                    flag = false;
                    out.write("您上一次訪問本站的時間是:");
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    out.write(new Date(lastLoginTime).toLocaleString());
                    System.out.println(new Date(lastLoginTime).toLocaleString());
                }
            }
            if (flag) {
                out.write("這是您第一次訪問本站");
            }
        }
        //服務器給客戶端響應一個cookie
        Cookie cookie = new Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis()));
        //cookie有效期設置爲1天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

  <servlet>
    <servlet-name>cookieDemo01</servlet-name>
    <servlet-class>com.qing.servlet.CookieDemo01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cookieDemo01</servlet-name>
    <url-pattern>/cookie</url-pattern>
  </servlet-mapping>
</web-app>

cookie細節

  1. 一個cookie只能保存一個信息
  2. 一個web站點能夠給瀏覽器發送多個cookie,每一個站點最多存放20個cookie
  3. cookie大小有限制,通常爲4kb
  4. 瀏覽器存放cookie通常最多300

刪除cookie

  1. 不設置有效期,關閉瀏覽器,自動失效
  2. 設置有效期爲0

Session

什麼是session

  1. 服務器會給每一個用戶(瀏覽器)建立一個session對象
  2. 一個session獨佔一個瀏覽器,只要瀏覽器沒有關閉,這個session就存在
  3. 用戶登陸以後,整個網站均可以訪問

session使用場景

  1. 保存登陸用戶的信息
  2. 購物車信息
  3. 在整個網站中常用的數據,咱們將它保存在session中

session和cookie的區別

  1. cookie是把要保存的數據寫給瀏覽器,瀏覽器保存(能夠保存多個)
  2. session是把要保存的數據寫的用戶獨佔的session中,服務器保存(只保存重要的信息,減小服務器資源的浪費)
package com.qing.servlet;

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 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","清風");

        //獲取session的ID
        String id = session.getId();

        //判斷session是否是新建立的
        if (session.isNew()) {
            resp.getWriter().write("session建立成功,ID:" + id);
        } else {
            resp.getWriter().write("session已經在服務器中存在了,ID:" + id);
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
package com.qing.servlet;

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();

        //從session中取數據
        String name = (String) session.getAttribute("name");
        System.out.println(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
package com.qing.servlet;

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 {
        //解決中文亂碼問題
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        //獲得session
        HttpSession session = req.getSession();

        //手動註銷session
        session.invalidate();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

  <servlet>
    <servlet-name>cookieDemo01</servlet-name>
    <servlet-class>com.qing.servlet.CookieDemo01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cookieDemo01</servlet-name>
    <url-pattern>/cookie</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>sessionDemo01</servlet-name>
    <servlet-class>com.qing.servlet.SessionDemo01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sessionDemo01</servlet-name>
    <url-pattern>/session1</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>sessionDemo02</servlet-name>
    <servlet-class>com.qing.servlet.SessionDemo02</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sessionDemo02</servlet-name>
    <url-pattern>/session2</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>sessionDemo03</servlet-name>
    <servlet-class>com.qing.servlet.SessionDemo03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sessionDemo03</servlet-name>
    <url-pattern>/session3</url-pattern>
  </servlet-mapping>

  <!--設置session的默認失效時間-->
  <session-config>
    <!--15分鐘後session自動失效,以分鐘爲單位-->
    <session-timeout>15</session-timeout>
  </session-config>
</web-app>

設置session自動過時在web.xml中

<!--設置session的默認失效時間-->
<session-config>
  <!--15分鐘後session自動失效,以分鐘爲單位-->
  <session-timeout>15</session-timeout>
</session-config>
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息