【Servlet】Session的特点和使用
Session
Session用來存儲(chǔ)用戶的不同請求的共享數(shù)據(jù)。作用范圍:一次會(huì)話
Request 對象解決了一次請求內(nèi)的不同Servlet 的數(shù)據(jù)共享問題,那么一個(gè)用戶的不同請求的處理需要使用相同的數(shù)據(jù)怎么辦呢?
使用session 技術(shù)。
session 原理:
用戶使用瀏覽器第一次向服務(wù)器發(fā)送請求,服務(wù)器在接受到請求后,調(diào)用對應(yīng)的Servlet 進(jìn)行處理。在處理過程中會(huì)給用戶創(chuàng)建一個(gè)session 對象,用來存儲(chǔ)用戶請求處理相關(guān)的公共數(shù)據(jù),并將此session 對象的JSESSIONID 以Cookie 的形式存儲(chǔ)在瀏覽器中(臨時(shí)存儲(chǔ),瀏覽器關(guān)閉即失效)。
用戶在發(fā)起第二次請求及后續(xù)請求時(shí),請求信息中會(huì)附帶JSESSIONID,服務(wù)器在接收到請求后,調(diào)用對應(yīng)的Servlet 進(jìn)行請求處理,同時(shí)根據(jù)JSESSIONID 返回其對應(yīng)的session 對象。
特點(diǎn):
Session 技術(shù)是依賴Cookie 技術(shù)的服務(wù)器端的數(shù)據(jù)存儲(chǔ)技術(shù)。
由服務(wù)器進(jìn)行創(chuàng)建
每個(gè)用戶獨(dú)立擁有一個(gè)session
默認(rèn)存儲(chǔ)時(shí)間為30分鐘(在30分鐘內(nèi),session對象沒有被使用,則自動(dòng)銷毀)
設(shè)置session強(qiáng)制失效
hs.invalidate();作用:
解決了一個(gè)用戶的不同請求的數(shù)據(jù)共享問題。
使用:
創(chuàng)建Session 對象
存儲(chǔ)數(shù)據(jù)到session 對象
獲取session 對象
獲取數(shù)據(jù)從session 對象
如果獲取session 中不存在的數(shù)據(jù)返回null。
注意:
只要不關(guān)閉瀏覽器,并且session 不失效的情況下,同一個(gè)用戶的任意請求在項(xiàng)目的任意Servlet 中獲取到的都是同一個(gè)session對象。
作用域:
一次會(huì)話(瀏覽器關(guān)閉就失效)
案例:
登錄練習(xí)使用,詳見源碼
SessionServlet.java
package com.bjsxt.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /*** session技術(shù)學(xué)習(xí):* 問題:* 一個(gè)用戶的不同請求處理的數(shù)據(jù)共享怎么辦?* 解決:* 使用session技術(shù)* 原理:* 用戶第一次訪問服務(wù)器,服務(wù)器會(huì)創(chuàng)建一個(gè)session對象給此用戶,并將* 該session對象的JSESSIONID使用Cookie技術(shù)存儲(chǔ)到瀏覽器中,保證* 用戶的其他請求能夠獲取到同一個(gè)session對象,也保證了不同請求能夠獲取到* 共享的數(shù)據(jù)。* 特點(diǎn):* 存儲(chǔ)在服務(wù)器端* 服務(wù)器進(jìn)行創(chuàng)建* 依賴Cookie技術(shù)* 一次會(huì)話* 默認(rèn)存儲(chǔ)時(shí)間是30分鐘* 作用:* 解決了一個(gè)用戶不同請求處理的數(shù)據(jù)共享問題* 使用:* 創(chuàng)建session對象/獲取session對象HttpSession hs=req.getSession();如果請求中擁有session的標(biāo)識(shí)符也就是JSESSIONID,則返回其對應(yīng)的session隊(duì)形如果請求中沒有session的標(biāo)識(shí)符也就是JSESSIONID,則創(chuàng)建新的session對象,并將其JSESSIONID作為從cookie數(shù)據(jù)存儲(chǔ)到瀏覽器內(nèi)存中* 如果session對象是失效了,也會(huì)重新創(chuàng)建一個(gè)session對象,并將其JSESSIONID存儲(chǔ)在瀏覽器內(nèi)存中。* 設(shè)置session存儲(chǔ)時(shí)間* hs.setMaxInactiveInterval(int seconds);* 注意:* 在指定的時(shí)間內(nèi)session對象沒有被使用則銷毀,如果使用了則重新計(jì)時(shí)。* 設(shè)置session強(qiáng)制失效* hs.invalidate();* 存儲(chǔ)和獲取數(shù)據(jù)* 存儲(chǔ):hs.setAttribute(String name,Object value);* 獲取:hs.getAttribute(String name) 返回的數(shù)據(jù)類型為Object* 注意:* 存儲(chǔ)的動(dòng)作和取出的動(dòng)作發(fā)生在不同的請求中,但是存儲(chǔ)要先于取出執(zhí)行。* 使用時(shí)機(jī):* 一般用戶在登陸web項(xiàng)目時(shí)會(huì)將用戶的個(gè)人信息存儲(chǔ)到Sesion中,供該用戶的其他請求使用。* 總結(jié):* session解決了一個(gè)用戶的不同請求的數(shù)據(jù)共享問題,只要在JSESSIONID不失效和session對象不失效的情況下。* 用戶的任意請求在處理時(shí)都能獲取到同一個(gè)session對象。* 作用域:* 一次會(huì)話* 在JSESSIONID和SESSION對象不失效的情況下為整個(gè)項(xiàng)目內(nèi)。* session失效處理:* 將用戶請求中的JSESSIONID和后臺(tái)獲取到的SESSION對象的JSESSIONID進(jìn)行比對,如果一致* 則session沒有失效,如果不一致則證明session失效了。重定向到登錄頁面,讓用戶重新登錄。* 注意:* JSESSIONID存儲(chǔ)在了Cookie的臨時(shí)存儲(chǔ)空間中,瀏覽器關(guān)閉即失效。* * @author MyPC**/ public class SessionServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//設(shè)置請求編碼格式req.setCharacterEncoding("utf-8");//設(shè)置響應(yīng)編碼格式resp.setContentType("text/html;charset=utf-8");//獲取請求信息String name="張三";//處理請求信息//創(chuàng)建session對象HttpSession hs=req.getSession();//設(shè)置session的存儲(chǔ)時(shí)間//hs.setMaxInactiveInterval(5);System.out.println(hs.getId());//設(shè)置session強(qiáng)制失效//hs.invalidate();//存儲(chǔ)數(shù)據(jù)hs.setAttribute("name",name);//響應(yīng)處理結(jié)果//直接響應(yīng)resp.getWriter().write("session學(xué)習(xí)");//請求轉(zhuǎn)發(fā)//重定向} }top.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="cn.hanquan.orm.po.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標(biāo)題文檔</title> <link href="/09-Manager/css/style.css" rel="stylesheet" type="text/css" /> <script language="JavaScript" src="/09-Manager/js/jquery.js"></script> <script type="text/javascript">$(function() {//退出功能$("#out").click(function() {var flag = window.confirm("你真的要退出嗎?");if (flag) {window.top.location.href = "/09-Manager/UserServlet?oper=out";}})}) </script></head><body style="background:url(/09-Manager/images/topbg.gif) repeat-x;"><div class="topleft"><a href="/09-Manager/main/main.jsp" target="_parent"><img src="/09-Manager/images/logo.png" title="系統(tǒng)首頁" /></a></div><div class="topright"><!-- 退出 --> <ul><li><a href="javascript:void(0)" id="out">退出</a></li></ul><!-- 用戶名 --><div class="user"><span><%=((User)session.getAttribute("user")).getUname()%></span></div> </div></body> </html>總結(jié)
以上是生活随笔為你收集整理的【Servlet】Session的特点和使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Servlet】请求转发、重定向、Co
- 下一篇: 【Servlet】Tomcat公共 /