1、Session基本介紹
Session---會話,它是一個內置對象。會話打個比方說就是瀏覽網站:開始到結束,或者說購物從開始到結束。
2、Session機制
客戶端在第一次請求服務端時,服務端會產生一個Session對象(用於存儲客戶端信息),每一個Session對象都有唯一的SessionID(區別於其他客戶端),同時服務端會產生一個Cookie,並且該Cookie中有一對鍵值對name=JsessionID,value=SessionID。然后在響應客戶端的請求時將JsessionID傳給客戶端,至此客戶端就有了與服務端一一對應的值,即SessionID與JsessionID。
客戶端在第二次請求時,服務端會拿客戶端中的JsessionID,去服務端中的Session匹配SessionID,如果匹配成功,說明該客戶端不是第一次訪問。然后可以直接登錄開始會話。
3、Session的服務機制
a、Session存儲在服務端中
b、Session在同一個用戶請求時共享
c、實現機制:第一次客戶端請求時產生一個SessionId並賦值給Cookie的jSessionId,然后發送給客戶端,最終通過SessionId與JsessionId一一對應
4、舉個簡單例子
去超市存包,第一次去超市存包時,首先申請櫃子,將你的東西放進櫃子中,同時超市給你一個鑰匙,該鑰匙和你放東西的櫃子一一對應(就像SessionID和JsessionID一一對應)。等到你第二次再去取你的東西時,不需要再申請拿鑰匙,而是直接拿你手上的鑰匙(JsessionID)與櫃子(SessionID)一一對應打開櫃子,取得你的東西。
5、常用方法
a、getId()獲取SessionID
b、boolean isNew() 判斷是否是新用戶(一般在第一次訪問時使用)
c、void invalidate()使session失效(退出登錄,注銷)
d、void setAttribute()
e、Objetct getAttribute()
f、void setMaxInactiveInterval(時間一般為秒)最大有效(非活動時間)
g、int getMaxInactiveInterval()獲取最大有效時間(非活動時間)
6、Session實例
用戶請求登錄頁面login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登錄頁面</title>
</head>
<body>
<form action="check.jsp" method="post">
用戶名:<input type="text" name="uname"><br/>
密碼: <input type="password" name="upwd"><br/>
<input type="submit" name="提交"><br/>
</form>
</body>
</html>
登錄之后頁面,check.jsp(其實check.jsp在這相當於服務端)
<%@ page contentType="text/html;charset=UTF-8" language="java"<htm<head>
<title>校驗頁面</title> </head> <body> <%
//設置編碼方式 request.setCharacterEncoding("utf-8");
//獲得登錄的用戶名和密碼 String name=request.getParameter("uname"); String password=request.getParameter("upwd");
//校驗是否登錄成功 if(name.equals("zz")&&password.equals("1111")){ //如果登錄成功,開始建立session(Session一般在用戶登錄成功時創建) session.setAttribute("uname",name);//建立session session.setAttribute("upwd",password); //獲得sessionID,並將session在控制台輸出 System.out.println("sessionID"+session.getId()); //設置session有效時間 //session.setMaxInactiveInterval(10);
//這里不用創建Cookie,服務端內部會自己創建JSessionID //Cookie cookie=new Cookie("uname",name);
//response.addCookie(cookie); request.getRequestDispatcher("welcome.jsp").forward(request,response); }else{ response.sendRedirect("login.jsp"); } %> </body> </html>
如果登錄成功則進入welcome.jsp,否則跳回登錄頁面login.jsp
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 歡迎您: <% String name=(String)session.getAttribute("uname"); if(name==null){ response.sendRedirect("login.jsp"); }else { out.println(name); } %> <a href="invalidate.jsp">注銷</a> </body> </html>
在welcome中加入注銷功能,用<a href="invalidate.jsp">注銷</a>語句
invalidate.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% session.invalidate();//session失效 response.sendRedirect("login.jsp"); //session.removeAttribute("uname");//部分失效 %> </body> </html>
再建一個客戶端頁面A.jsp,在登錄之后,輸出下客戶端的JsessionId,看和之前的SessionId是否相等
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body>
<%
//同一個服務端有效
%>
<%=session.getAttribute("uname")%> <% Cookie cookie[]=request.getCookies(); for(Cookie cookie1:cookie){ //驗證SessionID和JSESSIONID相等 if(cookie1.getName().equals("JSESSIONID")) System.out.println("JSESSIONID"+cookie1.getValue()); } %> </body> </html>
7、Session與Cookie的區別
session | cookie | |
保存位置 | 服務端 | 客戶端 |
安全性 | 高 | 低 |
保存內容形式 | Object | String |
8、總結下boby中代碼格式
a、<%=%>輸出運算符
b、<% !%>全局變量
c、<% %>代碼運算符
9、常見狀態碼
a、404 資源不存在
b、403 權限不足
c、200 一切正常
d、300/30 頁面重定向
e、500 服務器代碼有誤