《上古卷軸OL》“漲潮”DLC現已登陸PC平臺
阿新 • • 發佈:2022-03-15
Cookie、Session
1.會話
會話:使用者開啟一個瀏覽器,點選了很多超連結,同時訪問多個web資源,再到關閉瀏覽器,這個過程
有狀態會話:服務端給客戶端一個信件, 客戶端下次訪問服務端的時候帶上信件(Cookie);伺服器等級你來過了, 下次你來的時候匹配你(Session)
2.儲存會話的兩種技術
Cookie
- 客戶端技術(響應、請求)
Session
- 伺服器技術、利用這個技術可以儲存使用者的資訊,可以把資訊或者資料放在Session中
常見場景:網站登入後第二次訪問不再登入
3.Cookie
伺服器先判斷該請求得cookie是否存在,若不存在則建立一個cookie,使用者在訪問時帶著cookie訪問
1.從請求中拿到資訊, 獲得Cookie
Cookie []cookies = req.getCookie();
2.伺服器響應給客戶端cookie
cookie.getName() //獲得cookie中的key cookie.getValue() //獲得cookie中的value new Cookie("cookieName", "cookieValue") //新建一個cookie,如System.currentTimeMillion + "" cookie.setMaxAge(24 * 60 * 60) //設定cookie的有效期為1天 resp.addCookie(cookie) //在響應中新增cookie
3.cookie一般會儲存在本地檔案AppData中
4.一個網站的cookie是否存在上限
- 一個cookie只能儲存一個資訊
- 一個web站點可以給瀏覽器傳送多個cookie, 每個站點最多存20個
- 瀏覽器的上限為300個cookie
- cookie大小有限制,4kb
5.刪除cookie
- 不設定有效期,關閉瀏覽器自動失效
- 設定有效期的時間為0
- 建立一個新的同名的cookie,會自動覆蓋原有的cookie
6.如果在給網頁中文cookie出現亂碼
可以使用網路程式設計中的編碼、解碼的過程
URLEncoder.encode("content", "utf-8"); //編碼進行傳送 URLDecoder.decode("content", "utf-8"); //再次使用時需要解碼
7.記錄上次訪問時間程式碼
package com.Gw.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 Cookie01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//伺服器告訴你你來的時間,然後把這個時間封裝為一個信件,下次帶著來
resp.setContentType("utf-16");
req.setCharacterEncoding("utf-16");
resp.setCharacterEncoding("utf-16");
PrintWriter out = resp.getWriter();
//Cookie服務端從客戶端獲取, cookie可以存在多個
Cookie[] cookies = req.getCookies();
//判斷cookie是否存在
if(cookies != null){
//如果存在
out.println("上一次訪問的時間是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie1 = cookies[i];
//獲取cookie的名字
if(cookie1.getName().equals("LastLoginTime")){
long lastLoginTime = Long.parseLong(cookie1.getValue());
Date date = new Date(lastLoginTime);
out.println(date.toLocaleString());
}
}
}else {
out.print("這是第一次訪問網站");
}
//伺服器給客戶端響應一個cookie
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
//有效期為一天
cookie.setMaxAge(24 * 60 * 60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.Session
cookie是將資料直接通過cookie傳回使用者,而session則是通過SessionID在
1.什麼是Session:
- 伺服器會給每個使用者(瀏覽器)建立一個Session物件
- 一個Session獨佔一個瀏覽器,只要瀏覽器不關,Session一直有效
- 使用者登陸之後,所有子網頁都可以訪問
2.Session中常用的一些方法及使用:
//得到Session
HttpSession session = req.getSession();
//給Session中存東西,可以在不同網頁上進行存和取
session.setAttribute("obj", new Person("ygw", 20));
//從Session中取東西,注意需要強轉
Person person = (Person) session.getAttribute("obj");
//登出Session
session.removeAttribute("obj");
session.invalidate();
<!--在xml中登出Session的方法:會話自動過期-->
<!--設定session的失效時間-->
<session-config>
<!--以分鐘為單位,15分鐘後session失效-->
<session-timeout>15</session-timeout>
</session-config>
3.Session和Cookie的區別:
- cookie是把使用者的資料寫給使用者的瀏覽器儲存
- session把使用者的資料寫到使用者獨佔的session中,伺服器端儲存(儲存重要的資訊,減少伺服器資源的浪費)
- session物件由伺服器建立
4.使用場景:
- 儲存一個登陸使用者的資訊
- 子網頁的訪問
- 在整個專案中經常會使用的資料
5.一些參考程式碼:
package com.Gw.servlet;
import pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class Session01 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("obj", new Person("ygw", 20));
//獲取session的id
String id = session.getId();
//判斷session是不是新建立
if(session.isNew()){
resp.getWriter().write("session建立成功, id:" + id);
}else{
resp.getWriter().write("session已經在伺服器中存在, id:" + id);
}
//Session建立的時候做了什麼事情 -> 本質上像一個cookie
//Cookie cookie = new Cookie("JSESSIONID", "408EEFF1B5172C9AC61584CFD41023EC");
//resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.Gw.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 Session02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("obj");
System.out.println(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.Gw.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 Session03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("obj");
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}