Cookie:小甜點
1.概念:
2.快速入門:
3.實現原理
4.cookie的細節
5.Cookie的特點和作用
JSP:入門學習
1.概念:
2.原理
3.JSP的腳本:JSP定義Java代碼的方式
4. JSP的內置對象:
Session:主菜
1.概念:
2.快速入門:
HttpSession session=request.getSession();
Object getAttribute(String name) void setAttribute(String name, Object value) void removeAttribute(String name)
3.原理
4.細節:
Cookie c=new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c);
<session-config> <session-timeout>30</session-timeout> </session-config>
5.session的特點
在 Web 應用程序中(通俗點,可以理解成一個網站),Session 和 Cookie 是兩個非常重要的概念,主要用于實現用戶身份認證、數據傳遞等功能。今天就來講講這兩個東西。
對于當時剛開始接觸到這兩個概念的我來說,這兩個東西是非常模糊的,當然,這樣也和我自己 Java 基礎不牢固有關,導致在學習 Java Web 的過程中,埋下了許多地雷。現如今,從新梳理下,希望能給屏幕前的你帶來收獲。
本篇文章目標人群是學了后忘了的,學了后想要鞏固的。當然,還沒學,那就更好啦,直接看這一篇就夠了!
Session 是 Web 應用程序中的一種會話管理機制,用于存儲和維護用戶的會話狀態。
那問題來了,什么是「會話」?
會話是指在用戶與服務器之間的一系列請求和響應之間的交互過程。
當用戶訪問 Web 應用時,服務器會創建一個唯一的會話 ID,并將其存儲在用戶的瀏覽器中的 Cookie 中。在接下來的請求中,瀏覽器會將會話 ID 作為參數發送給服務器,以便服務器可以識別用戶并將其請求與之前的請求相關聯。
由于 HTTP 協議是無狀態的,當用戶在網站中進行多次請求,服務器并不能判斷這些請求是不是來自同一用戶,所以出現了一種技術,這種技術稱為「會話跟蹤技術」。
會話跟蹤技術就能解決這個問題。與無狀態的通信相比,會話是一種有狀態的通信,這種通信至少需要一方來維護當前的狀態信息和歷史信息。
而 Session 就是其中一種會話跟蹤技術,當然,后面說的 Cookie 也是。
Session 的原理是基于服務器端的存儲和管理,因此相對來說比較安全。在用戶訪問 Web 應用程序時,服務器會為每個用戶創建一個唯一的 Session ID,服務器會將 Session ID 和對應的會話狀態存儲在內存或者數據庫中,同時也返回一份 Session ID 給瀏覽器,讓瀏覽器存儲在 Cookie 中,并在一定時間內保持有效。當用戶進行后續的請求時,服務器會根據 Session ID 來識別用戶,并獲取和維護用戶的會話狀態。最后,當用戶關閉瀏覽器或者超過一定時間沒有活動時,服務器會自動銷毀對應的 Session。
Session 的優點是安全性相對較高,存儲容量可以存儲任意數據類型,并且可以設置失效時間。但是它也存在一些缺點:
那服務器這邊是怎樣去存儲和管理的呢?代碼是怎樣寫的呢?
在 Java Web 中,可以使用 Servlet API 中封裝好的 Session 對象(HttpSession)來進行操作。
在Servlet API中,HttpSession 由 Servlet容器(比如 Tomcat)創建,它可以存儲任意的 Java 對象,我們可以通過 setAttribute() 方法將對象綁定到 Session 中,之后通過 getAttribute() 方法獲取綁定在 Session 中的對象。
也就是說,可以在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。
我們可以通過 HttpServletRequest 的 getSession() 方法來獲取 HttpSession 對象。如果 HttpSession 對象不存在,則會創建一個新的 Session 對象。
以下是一些常用的 Session 對象的方法:
示例代碼:
SessionServlet:
@WebServlet(name="SessionServlet", urlPatterns="/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取 Session 對象
HttpSession session=req.getSession();
// 將用戶名存儲到 Session 中
session.setAttribute("username", req.getParameter("username"));
// 重定向到另一個頁面
resp.sendRedirect("anotherPage.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
復制代碼
這里使用了 @WebServlet 來配置這個 Servlet,處理的請求映射的路徑為 /session,主要進行了 Session 對象的相關操作,存儲了用戶信息,重定向到另一個頁面,通過 Session,此時在另一個頁面,就能夠獲取到存儲的信息。
anotherPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<html>
<head>
<title>這里是有Session的</title>
</head>
<body>
<%
String username=(String) session.getAttribute("username");
%>
<h2>從Session中獲取的信息:<%=username%></h2>
</body>
</html>
復制代碼
@WebServlet(name="SessionIdServlet", urlPatterns="/sessionId")
public class SessionIdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session=req.getSession();
// 獲取 SessionID
String sessionId=session.getId();
// 創建名為JSESSIONID的 Cookie
Cookie cookie=new Cookie("JSESSIONID", sessionId);
// 設置 Cookie 效時間為30分鐘
cookie.setMaxAge(30 * 60);
// 將 Cookie 追加到響應中返回給瀏覽器
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
復制代碼
通過瀏覽器向這個路徑 /sessionId 發起請求,就會接收到服務器返回的響應,這里的響應就有我們進行處理的名為 JSESSIONID 的 Cookie
Cookie 和 Session 總是會被拿來比較的。Cookie 和 Session 都是用來跟蹤瀏覽器用戶身份的會話技術,或者說一種機制。它們都可以實現在多個頁面之間共享用戶的狀態。
Cookie 是一種在客戶端(瀏覽器)保存數據的機制。
瀏覽器第一次發送請求到服務器,服務器就創建 Cookie(上面的代碼中我們寫了),該 Cookie 中包含著信息,可以是用戶的信息(用戶偏好設置、廣告偏好),然將該 Cookie 發送到瀏覽器。
瀏覽器之后再次訪問服務器時就會攜帶服務器創建的 Cookie,這不需要我們做任何操作,不需要寫任何代碼,瀏覽器幫我們實現了在每一次的請求中都攜帶上 Cookie。服務器端通過 Cookie 中攜帶的數據區分不同的用戶。
Cookie 的優點是可以長時間保存,并且可以在客戶端設置,但是它也存在一些缺點:
Session 是一種服務器端的存儲機制,它將用戶狀態信息存儲在服務器上,每個用戶都有一個獨立的 Session。
在用戶第一次訪問服務器的時候,服務器會為其創建一個 Session,并將 Session ID 放到一個名為 JSESSIONID 的 Cookie 中發送給瀏覽器。
Cookie 是一種客戶端(瀏覽器)存儲機制,它將用戶狀態信息存儲在客戶端瀏覽器上。我們知道,用戶第一次訪問服務器的時候,服務器會將一些數據(比如 JSESSIONID)寫入 Cookie 并發送給客戶端,客戶端在后續的請求中會將 Cookie 發送給服務器。
在存儲容量方面,Cookie 的存儲容量較小,一般只能存儲 ASCII 碼,而 Session 可以存儲任意數據類型。在安全性方面,Session 相對于 Cookie 更加安全,因為 Session 存儲在服務器,客戶端無法直接訪問。在跨域共享方面,Cookie 可以跨域共享,而 Session 只能在同一域名下共享。
由本人水平所限,難免有錯誤以及不足之處, 屏幕前的靚仔靚女們 如有發現,懇請指出!
最后,謝謝你看到這里,謝謝你認真對待我的努力,希望這篇博客對你有所幫助!
你輕輕地點了個贊,那將在我的心里世界增添一顆明亮而耀眼的星!
equest和response
request:封裝了http請求信息,通過這個對象去獲取請求信息,他是ServletRequest的子接口
response:封裝了相應信息
//獲取姓名的值
//姓名:< input type=“text” name=“username” id=“username”>< br/>
//input屬性name的值
String name=request.getParameter(“username”); 獲取多個值getParameterValues
System.out.println(name);
//response.getWiter()方法,把結果相應到瀏覽器
PrintWriter out=response.getWriter();
out.write("<h 1 >"+name+"</ h1>");
轉碼
request.setCharacterEncoding(“utf-8”);
response.setContentType(“text/html;charset=utf-8”);
//請求轉發:把請求轉發給另一個servlet處理
String path="/testServlet";
request.getRequestDispatcher(path).forward(request, response);
//請求重定向
response.sendRedirect(“testServlet”);
1.請求轉發和請求重定向
本質區別:請求轉發只是發了一次請求,重定向發了兩次請求
(1)請求轉發:地址欄還是初次請求的地址欄
請求重定向:地址欄不是初次請求的地址欄,地址欄是最后一次相應的地址欄
(2)請求轉發:在最終的servlet中,request對象和中轉的request對象是同一個對象
請求重定向:最終的servlet中,request對象和中轉的request對象不是同一個對象
(3)請求轉發:‘/’代表當前web應用的根目錄
請求重定向:‘/’代表當前web站點的根目錄
(4)請求轉發:只能轉到當前web資源
請求重定向:可以重定向到外部資源
2.表單重復提交
(1)點擊了瀏覽器的后退按鈕,再點擊提交
(2)在相應頁面未完成響應時,重復點擊提交按鈕
(3)在表單請求servlet,而servlet又通過轉發的方式相應到一個servlet處理,當我刷新時,地址欄還是原來請求的那個地址欄,這樣就出現了重復提交。重定向不會出現重復提交
/***********************************************************************/
設置令牌
< body>
<%
String uuid=UUID.randomUUID().toString().replace("-","");
request.getSession().setAttribute(“token”, uuid);
%>
< form action=“work” method=“post”>
< input type=“hidden” value="<%=uuid%>" name=“token”>
用戶名:< input type=“text” name=“user” id=“username”>< br/>
密碼:< input type=“text” name=“pwd” id=“pwd”>< br/>
< input type=“submit” value=“提交”>
< /form>
< /body>
瀏覽器需要對其發出的每個請求消息都進行標識
這個標識號就稱之為會話ID(SessionID)
獲取session
HttpSession session=request.getSession();
*請認真填寫需求信息,我們會在24小時內與您取得聯系。