WEB應用程式開發之創建Session物件與實作界面安全退出/登錄功能
- 什么是session
- 創建Session思維圖
- 代碼測驗與結果
- Session方法
- Session生命周期
- 創建方式
- 銷毀方式
- 一. 服務器關閉
- 二. 長時間不呼叫自動銷毀
- 三. 呼叫invalidate()方法 銷毀session
- 安全退出
什么是session
Session物件是javax.servlet.http.HttpSession的實體
它在第一個JSP頁面被裝載時自動創建,完成會話期管理,
從一個客戶打開瀏覽器并連接到服務器開始,到客戶關閉瀏覽器離開這個服務器結束,被稱為一個會話,
Servlet API中,定義了HttpSession介面,用來封裝會話物件, HttpSession是介面,會話物件是Web容器創建的,在Servlet中使用
HttpServletRequest中的方法獲得會話物件
public HttpSession getSession():獲取跟當前請求相關的session,如果不存在session,就創建一個新的session物件回傳
下來是展示Session實作會話機制的程序
創建Session思維圖

代碼方面新增兩行代碼,放置在之前設定好的LoginServlet物件中
//獲取服務器生成的session物件
HttpSession httpSession=req.getSession();
//向session物件設定一段鍵值,登陸成功后將用戶資訊儲存到一個物件的session物件中
httpSession.setAttribute("user",user);
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = null;
try {
resp.setContentType("text/html;charset=utf-8");//回應格式設定
req.setCharacterEncoding("utf-8");//設定post請求資料解碼格式
String account = req.getParameter("account");
String password = req.getParameter("password");
System.out.println(account);
System.out.println(password);
LoginDao loginDao=new LoginDao();
User user= loginDao.checkLogin(account,password);
out= resp.getWriter();
if(user!=null){
//獲取服務器生成的session物件
HttpSession httpSession=req.getSession();
//向session物件設定一段鍵值,登陸成功后將用戶資訊儲存到一個物件的session物件中
httpSession.setAttribute("user",user);
Gson gson=new Gson();
String s=gson.toJson(user);
System.out.println(s);
out.println(s);
}else {
out.println(1);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("服務器回應例外");
}
}
}
代碼測驗與結果
開始進入測驗階段
1、當容器創建一個新的HttpSession物件后,即生成一個亂數,稱為會話ID,并將ID值封裝成一個名字為JSESSIONID的session,回傳給客戶端

2、呼叫request.getSession方法獲得會話物件時,容器先從request中獲取JSESSIONID值,根據JSESSIONID值查找到對應的會話物件,回傳使用,
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
User user=(User)session.getAttribute("user");
session.invalidate();//銷毀瀏覽器
}
success界面只進行請求不作任何回應
<input type="button" value="測驗" οnclick="test()">
function test() { $.get("login",function (res) { })}

3、如果沒有獲取到JSESSIONID值,認為當前的請求沒有相關聯的會話物件,重復步驟1
注意:利用不同的瀏覽器同時向網頁服務器發送請求,生成出來的Session物件是不同的
Session方法
Session中還有一系列方法,可以參考使用

Session生命周期
創建方式
第一次訪問Servlet時在服務器端創建
銷毀方式
一. 服務器關閉
二. 長時間不呼叫自動銷毀
會話物件是容器創建的,并保存在容器中,如果客戶端連接到服務器后,卻置之不理,不做任何操作,那么容器維護這些會話物件將占用很多資源,因此,容器都會在默認時間內銷毀會話物件,多數容器默認30分鐘銷毀會話物件,可以通過以下兩種方式進行更改銷毀時間
1. 可以在web.xml中進行配置,修改默認時間,例如,修改為50分鐘銷毀,
<session-config>
<session-timeout>50</session-timeout>
</session-config>
2.可以利用上面的方法
SetMaxInactiveInterval (int interval )設定session的最大非活動時間,以秒為單位,超時將被銷毀,
三. 呼叫invalidate()方法 銷毀session
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();//銷毀瀏覽器
}
安全退出
我們來利用銷毀清除留在服務器上的Session資訊達到安全退出的目的


Session物件已經被銷毀了無法找到之前id
function exit() {
if(confirm("您確定要退出嗎")){
//洗掉前端用戶資訊
window.sessionStorage.removeItem("user");
$.get("login",function (res) {
location.assign("login.html")
})
}
}
<input type="button" value="安全退出" onclick="exit()">
我們也可以利用此方法實作安全登錄的目的
$(function () {
var str=window.sessionStorage.getItem("user");
//前端判斷用戶是否登錄
if(str==null){
location.replace("login.html");
}
var user=$.parseJSON(str);
$("#accountId").html(user.account);
})
如果沒有登錄想要通過鏈接地址的方式強制進入,界面就會進行閃退,退回事先設定好的Login.html登錄界面
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386793.html
標籤:其他
下一篇:搭建個人XSS平臺
