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è)相同的瀏覽器也是可以獲取到的金吗。
案例二:演示保存用戶登錄信息(精通)
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(“....路徑....”)處理一下