1. 程式人生 > 其它 >Java Web05:Cookie和Session

Java Web05:Cookie和Session

客戶端技術,第一次訪問時伺服器端通過響應傳送,第二次訪問時客戶端通過請求攜帶

資訊存放在客戶端

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 HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {

        res.setContentType("text/html;charset=utf-8");

        PrintWriter out = res.getWriter();

        /**
         * getCookies()方法通過請求獲取Cookie陣列,包含多個Cookie
         */
        Cookie[] cookies = req.getCookies();

        boolean isFirst = true;

        /**
         * 第一次訪問時沒有Cookie,需要伺服器響應返回Cookie
         */
        for (Cookie cookie : cookies) {

            /**
             * 如果存在名為lastLoginTime的Cookie,將其轉換為標準時間
             * getName()方法獲得Cookie值
             */
            if (cookie.getName().equals("lastLoginTime")){

                isFirst = false;
                out.write("上一次訪問時間是:");

                long l = Long.parseLong(cookie.getValue());
                Date date = new Date(l);
                out.write(date.toLocaleString());
            }
        }

        if (isFirst) {
            out.write("這是第一次訪問,需要響應返回一個Cookie");
        }

        /**
         * 伺服器端傳送Cookie
         * new Cookie()方法新建Cookie
         * addCookie()方法新增Cookie
         */
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        res.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

Cookie的限制:

  • 一個Cookie只能儲存一個資訊,只能儲存字串
  • 一個Web站點最多存放20個Cookie
  • Cookie大小限制為4Kb
  • 瀏覽器最多存放300個Cookie

刪除Cookie的方法:

  • 不設定有效期,關閉瀏覽器自動失效
  • 新建一個同名的Cookie,將其有效期設定為0,然後響應回去,可以讓該Cookie立即過期

Session

伺服器端技術,可以儲存使用者的會話資訊,將資訊和資料放在Session中

伺服器會給每一個使用者(瀏覽器)建立一個Session物件,不僅可以儲存字串,還可以儲存物件

伺服器響應給使用者一個Session的ID(就是一個Cookie),使用者憑藉這個ID在伺服器存取資訊,資訊存放在伺服器端

setAttribute()

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

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {

        res.setContentType("text/html;charset=utf-8");

        PrintWriter out = res.getWriter();

        /**
         * getSession()方法通過請求獲取Session()
         */
        HttpSession session = req.getSession();

        /**
         * setAttribute()方法往Session存東西
         * 其本質也是新建了一個個Cookie
         */
        session.setAttribute("name", "Java");

        /**
         * getId()方法獲取Session的ID
         */
        String id = session.getId();

        /**
         * 判斷Session是否已經存在
         */
        if (session.isNew()) {
            out.write("Session建立成功,ID為:" + id);
        }
        else {
            out.write("Session已經存在,ID為:" + id);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

getAttribute()

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

public class test extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {

        res.setContentType("text/html;charset=utf-8");

        PrintWriter out = res.getWriter();

        /**
         * getSession()方法通過請求獲取Session()
         */
        HttpSession session = req.getSession();

        /**
         * getAttribute()方法獲取已經存在的Session
         */
        String name = (String) session.getAttribute("name");

        out.println(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

登出Session的方法:

  • invalidate()方法,手動登出
  • 配置web.xml檔案,自動登出
<!--配置Session-->
<session-config>
    <!--設定15分鐘後過期-->
    <session-timeout>15</session-timeout>
</session-config>