Cookie、Session
會話
**會話:**使用者打開一個浏覽器,點選了很多超連結,通路多個web資源,關閉浏覽器,這個過程可以稱為會話。
有狀态會話:
一個網站,怎麼證明你來過?
- 用戶端 服務端
- 服務端給用戶端一個信件,用戶端下次通路服務端帶上信件即可;cookie
- 伺服器登記你來過,下次你來的時候進行比對;session
儲存會話的兩種技術
- cookie
- 用戶端技術(響應,請求)(服務端傳給用戶端通過響應,用戶端傳給服務端通過請求)
- session
- 伺服器技術,利用這個技術,可以儲存使用者的會話資訊,可以把資訊或者資料放在Session中!
常見場景:網站登入之後,你下次不用再登入,第二次直接登入上去
Cookie
- 從請求中拿到cookie
- 伺服器響應給用戶端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是否存在上限!
- 一個Cookie隻能儲存一個資訊;
- 一個web站點可以給浏覽器發送多個cookie,最多存放20個Cookie;
- Cookie大小有限制 4kb;
- 300個Cookie浏覽器上限。
删除Cookie:
- 不設定有效期,關閉浏覽器,自動失效;
- 這是有效期時間為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>