Day10_19——HttpSession

1扛或、HttpSession概述

  • HttpSession時(shí)由JavaWeb提供的瘫析,用來(lái)會(huì)話跟蹤的類(lèi)江醇。Session是服務(wù)器端對(duì)象佛寿,保存在服務(wù)器端幌墓!

  • HttpSession是Servlet三大域?qū)ο笾?request(一個(gè)請(qǐng)求一個(gè)request)、session(一個(gè)用戶一個(gè)session)冀泻、application(ServletContext))常侣。所有HttpSession也有setAttribute()、getAttribute()弹渔、removeAttribute()胳施。

  • HttpSession底層依賴(lài)Cookie,或是URL重寫(xiě)肢专!

2舞肆、HttpSession的作用

  • 會(huì)話范圍:會(huì)話范圍是某個(gè)用戶從首次訪問(wèn)服務(wù)器開(kāi)始,到該用戶關(guān)閉瀏覽器結(jié)束博杖!

會(huì)話:一個(gè)用戶對(duì)服務(wù)器的多次連貫性請(qǐng)求椿胯!所謂連貫性請(qǐng)求,就是該用戶多次請(qǐng)求中間沒(méi)有關(guān)閉的瀏覽器剃根。

  • 服務(wù)器會(huì)為每個(gè)客戶端創(chuàng)建一個(gè)session對(duì)象压状,session就好比客戶在服務(wù)器端的賬戶,它們被服務(wù)器保存到一個(gè)Map集合中跟继,這個(gè)Map被稱(chēng)之為session緩存

Servlet中得到session對(duì)象:HttpSession session = rerquest.getSession();

Jsp中得到session對(duì)象:session是jsp內(nèi)置對(duì)象之一,不用創(chuàng)建就可以直接使用镣丑。

  • session域的相關(guān)方法:

void setAttribute(String name, Object value);

Object getAttribute(String name);

void removeAttribute(String name);

案例一:在session域中保存和獲取數(shù)據(jù)

a.jsp


<body>

    <h1>保存數(shù)據(jù)到session域中</h1>

<%

session.setAttribute("aaa", "AAA");

%>

  </body>

b.jsp

<body>

<h1>獲取session域中的數(shù)據(jù)</h1>

<%

String s = (String) session.getAttribute("aaa");

%>

<%=s%>

</body>

總結(jié):在保存數(shù)據(jù)之后舔糖,只要不關(guān)閉瀏覽器就可以獲取到session中的數(shù)據(jù)。IE瀏覽器中的新建會(huì)話除外莺匠。再打開(kāi)一個(gè)相同的瀏覽器也是可以獲取到的金吗。

案例二:演示保存用戶登錄信息(精通)

案例.jpg

Login.jsp

<script type=*"text/javascript"*>

**function** _change(){

/*

1.得到img元素

2.修改其src為/SessionDemo/VeifyCodeServlet

*/

**var** imgEle = document.getElementById("img");

**var** v = **new** Date;

**var** s = v.getTime();

//imgEle.src = "/SessionDemo/VeifyCodeServlet?a=" + new Date().getTime();

imgEle.src = "/SessionDemo/VeifyCodeServlet?a=" + s;

}

</script>

</head>

<body>

<h1>登錄</h1>

<%

/*

讀取名為uname的cookie,如果為空顯示"",不為空顯示cookie的值

 */

String uname = "";

Cookie[] cs = request.getCookies(); // 獲取請(qǐng)求中所有的cookie

**if**(cs != **null**){ // cookie不為空

**for**(Cookie c : cs){ // 循環(huán)遍歷Cookie[]

**if**("uname".equals(c.getName())){ // 查找名稱(chēng)為uname的cookie

uname = c.getValue(); // 將值賦給uname變量

}

}

}

%>

<%

String s = "";

String msg = (String) request.getAttribute("msg");

**if**(msg != **null**) {

s = msg;

}

%>

<%-- 本頁(yè)面提供登錄表單趣竣,還要顯示錯(cuò)誤信息 --%>

<font color=*"red"*><b><%=s%></b> </font>

<form action=*"/SessionDemo/LoginServlet"* method=*"post"*>

用戶名:<input type=*"text"* name=*"username"* value=*"*<%=uname%>*"* /><br /> 

密碼:<input type=*"password"* name=*"password"* /><br /> 

驗(yàn)證碼:<input type=*"text"* name=*"vCode"*  size=*"3"*/>

<img  id=*"img"* src=*"/SessionDemo/VeifyCodeServlet"*>

<a href=*"javascript: _change()"*>看不請(qǐng)摇庙,換一張</a>

<br />

<input type=*"submit"* value=*"登錄"* />

</form>

</body>
**VeifyCodeServlet****.java**

**public** **void** doGet(HttpServletRequest request, HttpServletResponse response)

**throws** ServletException, IOException {

/*

 * 1.生成圖片(用到了VerifyCode生成驗(yàn)證碼的類(lèi))

 * 2.保存圖片上的文本到session中

 * 3.把圖片響應(yīng)給客戶端

 */

VerifyCode vc = **new** VerifyCode();

BufferedImage bi = vc.getImage();

request.getSession().setAttribute("session_vcode", vc.getText());

vc.*output*(bi, response.getOutputStream());

}

LoginServlet.java


**public** **void** doPost(HttpServletRequest request, HttpServletResponse response)

**throws** ServletException, IOException {

/*

 * 驗(yàn)證碼處理 1.得到session里的驗(yàn)證碼文本 2.獲取到文本框中輸入的文本 3.比較

 */

String <u>sessiontext</u> = (String) request.getSession().getAttribute(

"session_vcode");

String wtext = request.getParameter("vCode");

**if** (!wtext.equalsIgnoreCase(sessiontext)) {

request.setAttribute("msg", "輸入的驗(yàn)證碼有誤");

request.getRequestDispatcher("/session2/login.jsp").forward(

request, response);

**return**;

}

/*

 * 1、獲取表單信息

 */

// 中文處理

request.setCharacterEncoding("utf-8");

// 獲取

String username = request.getParameter("username");

String <u>password</u> = request.getParameter("password");

/*

 * 2遥缕、校驗(yàn)用戶名和密碼是否正確

 */

**if** (!"itcast".equalsIgnoreCase(username)) {

// 成功

/*

 * 附加項(xiàng):把用戶名保存到cookie中卫袒,發(fā)送給客戶端瀏覽器

 * 當(dāng)再次打開(kāi)login.jsp時(shí),login.jsp會(huì)讀取request中的cookie单匣,把它顯示到用戶名文本框中

 */

Cookie cookie = **new** Cookie("uname", username);// 創(chuàng)建cookie

cookie.setMaxAge(60*60*24);// 設(shè)置cookie名長(zhǎng)為一天

response.addCookie(cookie);// 保存cookie

/*

 * 3夕凝、如果成功 > 保存用戶信息到session中 > 重定向到succ1.<u>jsp</u>

 */

HttpSession session = request.getSession();// 獲取session對(duì)象

session.setAttribute("username", username);// 向session域中保存數(shù)據(jù)

response.sendRedirect("/SessionDemo/session2/succ1.jsp");

} **else** {

// 失敗

/*

 * 4宝穗、如果失敗 > 保存錯(cuò)誤數(shù)據(jù)到request域中 >

 * 轉(zhuǎn)發(fā)到login.jsp(如果使用重定向request域中的數(shù)據(jù)就會(huì)因?yàn)榈诙握?qǐng)求 而獲取不到)

 */

request.setAttribute("msg", "用戶名或密碼錯(cuò)誤");

RequestDispatcher rd = request

.getRequestDispatcher("/session2/login.jsp");

rd.forward(request, response);// 轉(zhuǎn)發(fā)

}

}

succ1.jsp

<body>

<%

String username = (String)session.getAttribute("username");

**if**(username==**null**){

/*

 *  向request域中保存錯(cuò)誤信息,并轉(zhuǎn)發(fā)到login.jsp

 */

request.setAttribute("msg", "你還沒(méi)有登錄");

request.getRequestDispatcher("/session2/login.jsp").forward(request, response);

**return**;

}

%>

<h1>succ1</h1>

歡迎<%=username %>訪問(wèn)本頁(yè)面码秉。

</body>

Succ2.jsp

<body>

<%

String username = (String)session.getAttribute("username");

**if**(username==**null**){

/*

 *  向request域中保存錯(cuò)誤信息逮矛,并轉(zhuǎn)發(fā)到login.jsp

 */

request.setAttribute("msg", "你還沒(méi)有登錄");

request.getRequestDispatcher("/session2/login.jsp").forward(request, response);

**return**;

}

%>

<h1>succ1</h1>

歡迎<%=username %>訪問(wèn)本頁(yè)面。

</body>

3转砖、HttpSession的原理(銀行卡的用法相同)

  • request.getSession()的方法:

獲取Cookie中的JSESSIONDID:

(服務(wù)器不會(huì)馬上創(chuàng)建session须鼎,在第一次獲取時(shí)才會(huì)創(chuàng)建——request.getSession();)

<> 如果sessionID不存在,創(chuàng)建session府蔗,把session保存起來(lái)晋控,把新創(chuàng)建的session保存到Cookie中

<> 如果sessionID存在,通過(guò)sessionID查找session對(duì)象礁竞,如果沒(méi)有查到糖荒,創(chuàng)建session,把session保存起來(lái)模捂,把新創(chuàng)建的sessionID保存到Cookie中

<> 如果session存在捶朵,通過(guò)sessionID找到了session對(duì)象,那么就不會(huì)再創(chuàng)建session對(duì)象了狂男。

<> 返回session综看。

如果創(chuàng)建了新得session,瀏覽器會(huì)得到一個(gè)包含了sessionID的Cookie岖食,這個(gè)Cookie的生命是-1(在瀏覽器中存在)

  • request.getSession(false) request.getSession(ture) request.getSession() 后兩個(gè)效果一樣

第一個(gè)方法:如果session緩存中红碑,不存在session,那么返回null泡垃,而不會(huì)返回session對(duì)象

4析珊、HttpSession的其他方法(用最多的還是session的域方法)

  • String getID():獲取sessionID;(UUID隨機(jī)生成32位16進(jìn)制數(shù))

  • int getMaxInactiveInterval():獲取session可以的最大活動(dòng)時(shí)間(秒)蔑穴,默認(rèn)位30分鐘(一般不寫(xiě))

  • void invalidate():讓session失效V已啊(可以用來(lái)做退出效果)

  • Boolean isNew():查看session是否為新。

request.getSession().isNew(); 可以檢驗(yàn)是創(chuàng)建session還是返回session

5存和、在web.xml中配置session的最大活動(dòng)時(shí)間

<session-config>

<session-timeout>時(shí)間(分)</session-timeout>

</session-config>

6奕剃、URL重寫(xiě)(理解)

就是把所有頁(yè)面中的路徑,都使用response.encode URL(“....路徑....”)處理一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捐腿,一起剝皮案震驚了整個(gè)濱河市纵朋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茄袖,老刑警劉巖操软,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宪祥,居然都是意外死亡寺鸥,警方通過(guò)查閱死者的電腦和手機(jī)猪钮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胆建,“玉大人烤低,你說(shuō)我怎么就攤上這事“试兀” “怎么了扑馁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凉驻。 經(jīng)常有香客問(wèn)我腻要,道長(zhǎng),這世上最難降的妖魔是什么涝登? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任雄家,我火速辦了婚禮,結(jié)果婚禮上胀滚,老公的妹妹穿的比我還像新娘趟济。我一直安慰自己,他們只是感情好咽笼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布顷编。 她就那樣靜靜地躺著,像睡著了一般剑刑。 火紅的嫁衣襯著肌膚如雪媳纬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天施掏,我揣著相機(jī)與錄音钮惠,去河邊找鬼。 笑死七芭,一個(gè)胖子當(dāng)著我的面吹牛素挽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抖苦,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼米死!你這毒婦竟也來(lái)了锌历?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤峦筒,失蹤者是張志新(化名)和其女友劉穎究西,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體物喷,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卤材,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年遮斥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扇丛。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡术吗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帆精,到底是詐尸還是另有隱情较屿,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布卓练,位于F島的核電站隘蝎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏襟企。R本人自食惡果不足惜嘱么,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顽悼。 院中可真熱鬧曼振,春花似錦、人聲如沸表蝙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)府蛇。三九已至集索,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汇跨,已是汗流浹背务荆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穷遂,地道東北人函匕。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蚪黑,于是被迫代替她去往敵國(guó)和親盅惜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355