Session
1.會話
會話:指用戶打開了一個瀏覽器,點擊了很多超鏈接,訪問了多個Web資源,後關閉瀏覽器,這個過程可以稱之爲“會話”。
有狀態的會話:例如一個學生來過咱們班的教室,下次再來的時候,我們就能記住他來過。這個就是有狀態的會話。
Eg:
一個網站如何證明你來過?
客戶端<——>服務端
1.服務端會給客戶一個 信件,客戶端下次訪問的時候,帶上這個信件,就可以被認出來了。(Cookie)。
2.服務器登記你來過了,下次再訪問的時候,會自動匹配你(Session)。
2.保存會話的兩種技術:
Cookie:
- 客戶端技術(具有響應,請求)
Session:
- 服務器技術,利用此技術,我們可以保存,用戶的會話信息,我們可以把信息或者數據放在Session中。
常見場景:
網站登錄後,關閉瀏覽器再打開此網頁,一般情況下第二次進入都不用再次登錄了,賬戶信息會被記住。
3.Session(重點!!!)
什麼是Session:
-
服務器會給每一個用戶創建一個Session對象。
-
一個Session獨佔一個瀏覽器,只要瀏覽器沒有關,這個Session就一直存在。
- 用戶登錄之後,整個網站的子頁面都是可以訪問的。Eg:保存用戶信息;保存購物車信息……
對比Session和Cookie:
-
Cookie是把用戶的數據寫給用戶的瀏覽器,瀏覽器保存。(可以保存多個)
-
Session是把用戶的數據寫到用戶的Session中,由服務器創建,服務器端保存。(應僅保存重要的信息,避免造成服務器端的資源浪費)
使用場景:
-
保存一個用戶登錄的信息。(用戶登錄;購物車等)
-
在整個網站中經常會使用的數據,我們將其保存在Session中。
代碼分析:
文件排序:
web.xml:
<servlet>
<servlet-name>Session1</servlet-name>
<servlet-class>com.edwin.servlet.SessionDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Session1</servlet-name>
<url-pattern>/Session1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Session2</servlet-name>
<servlet-class>com.edwin.servlet.SessionDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Session2</servlet-name>
<url-pattern>/Session2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Session3</servlet-name>
<servlet-class>com.edwin.servlet.SessionDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Session3</servlet-name>
<url-pattern>/Session3</url-pattern>
</servlet-mapping>
Session01:
package com.edwin.servlet;
import com.edwin.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
/
* @author Edwin D
* @date 2020.6.6 上午 11:11
*/
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("Edwin 段",17));
// 獲取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);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Session02:
package com.edwin.servlet;
import com.edwin.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;
/
* @author Edwin D
* @date 2020.6.6 下午 9:23
*/
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());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Session03:
package com.edwin.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;
/
* @author Edwin D
* @date 2020.6.6 下午 9:50
*/
public class SessionDemo03 extends HttpServlet {
// 清空Session
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
// 註銷原有的SessionID,但是會立刻生成了一個新的。
session.invalidate();
System.out.println("註銷了原有Session");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
使用後再訪問Session02:
後臺:
自動註銷的XML配置:
<!--設置Session默認失效的時間-->
<session-config>
<!--以分鐘爲單位,這裏是設置爲17分鐘後自動更換Session-->
<session-timeout>17</session-timeout>
</session-config>
效果對比:
1Min後:
後期的學習:
路漫漫其修遠兮,吾將上下而求索。
參考文獻
《【狂神說Java】JavaWeb入門到實戰》
2020.06.07