Java-Web程序設(shè)計(jì)與案例教程-第3章-Cookie與Session課件_第1頁(yè)
Java-Web程序設(shè)計(jì)與案例教程-第3章-Cookie與Session課件_第2頁(yè)
Java-Web程序設(shè)計(jì)與案例教程-第3章-Cookie與Session課件_第3頁(yè)
Java-Web程序設(shè)計(jì)與案例教程-第3章-Cookie與Session課件_第4頁(yè)
Java-Web程序設(shè)計(jì)與案例教程-第3章-Cookie與Session課件_第5頁(yè)
已閱讀5頁(yè),還剩95頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章Cookie與Session

第3章Cookie與Session本章內(nèi)容

基于Servlet的簡(jiǎn)單Web應(yīng)用

Cookie的含義和用法

Session的含義和用法

Session的工作原理個(gè)人信息模塊的實(shí)現(xiàn)基于MVC的購(gòu)物車(chē)本章內(nèi)容基于Servlet的簡(jiǎn)單Web應(yīng)用3.1使用Servlet編寫(xiě)簡(jiǎn)單Web應(yīng)用使用Servlet開(kāi)發(fā)一個(gè)模擬登錄的Web應(yīng)用主要功能登錄個(gè)人信息的完善和查詢(xún)3.1使用Servlet編寫(xiě)簡(jiǎn)單Web應(yīng)用使用Servl3.1使用Servlet編寫(xiě)簡(jiǎn)單Web應(yīng)用3.1.1Web應(yīng)用功能說(shuō)明3.1.2登錄模塊的實(shí)現(xiàn)3.1使用Servlet編寫(xiě)簡(jiǎn)單Web應(yīng)用3.1.1We3.1.1Web應(yīng)用功能說(shuō)明圖3.1登錄頁(yè)面圖3.2個(gè)人信息首頁(yè)用戶(hù)可通過(guò)圖3.1所示的登錄頁(yè)面填寫(xiě)用戶(hù)名和密碼進(jìn)行登錄操作,如果用戶(hù)名和密碼都不為空,則判定該登錄有效,顯示如圖3.2所示的個(gè)人信息應(yīng)用首頁(yè),該首頁(yè)不僅顯示了當(dāng)前用戶(hù)的個(gè)人信息的頁(yè)面鏈接,以及完善個(gè)人信息的頁(yè)面鏈接,還顯示了當(dāng)前的登錄用戶(hù)名,以及登錄時(shí)間信息3.1.1Web應(yīng)用功能說(shuō)明圖3.1登錄頁(yè)面圖Web應(yīng)用功能說(shuō)明當(dāng)點(diǎn)擊“查看個(gè)人信息”鏈接時(shí),系統(tǒng)應(yīng)顯示當(dāng)前登錄用戶(hù)完善后的個(gè)人信息。如果該用戶(hù)從來(lái)沒(méi)有點(diǎn)擊“完善個(gè)人信息”鏈接,則需要對(duì)信息進(jìn)行完善,此時(shí)系統(tǒng)會(huì)直接跳轉(zhuǎn)至“完善個(gè)人信息”頁(yè)面,如圖3.3和圖3.4所示。圖3.3完善個(gè)人信息1圖3.4完善個(gè)人信息23.1.1Web應(yīng)用功能說(shuō)明當(dāng)點(diǎn)擊“查看個(gè)人信息”鏈接時(shí),3.1.1Web應(yīng)用功能說(shuō)明如果當(dāng)前用戶(hù)已經(jīng)完善過(guò)個(gè)人信息,則直接顯示完善后的用戶(hù)信息,如圖3.5所示。圖3.5查看個(gè)人信息詳情3.1.1Web應(yīng)用功能說(shuō)明如果當(dāng)前用戶(hù)已經(jīng)完善過(guò)個(gè)人信息3.1.2登錄模塊的實(shí)現(xiàn)工程結(jié)構(gòu)如圖3.6圖3.6LoginDemo工程結(jié)構(gòu)1.“.zzti.entity”包中包含User和PersonalInfo兩個(gè)實(shí)體類(lèi),分別用來(lái)存儲(chǔ)用戶(hù)的登錄信息和當(dāng)前登錄用戶(hù)的具體個(gè)人信息2.“.zzti.servlet.view”包中存放展現(xiàn)給用戶(hù)的5個(gè)頁(yè)面,包括登錄頁(yè)面、Web應(yīng)用首頁(yè)、個(gè)人信息完善表單1、個(gè)人信息完善表單2、個(gè)人信息詳情頁(yè)面。3.“.zzti.servlet”包中包含兩個(gè)Servlet,“LoginServlet”的主要功能是對(duì)來(lái)自登錄頁(yè)面中的表單參數(shù)進(jìn)行校驗(yàn)和存儲(chǔ),“PersonalInfoProcess”的主要功能是接收來(lái)自個(gè)人信息完善表單中的數(shù)據(jù),對(duì)完善后的個(gè)人信息進(jìn)行封裝和存儲(chǔ)。3.1.2登錄模塊的實(shí)現(xiàn)工程結(jié)構(gòu)如圖3.6圖3.6Lo3.1.2登錄模塊的實(shí)現(xiàn)本章的登錄頁(yè)面根據(jù)用戶(hù)提交的參數(shù)正確與否來(lái)產(chǎn)生不同的響應(yīng),如果用戶(hù)名密碼都不為空,則跳轉(zhuǎn)到圖3.2;否則,跳轉(zhuǎn)到,如圖3.7所示的登錄頁(yè)面,并提示錯(cuò)誤信息。圖3.7登錄異常響應(yīng)結(jié)果頁(yè)面登錄模塊示例源碼:loginDemo(ch3-1)3.1.2登錄模塊的實(shí)現(xiàn)本章的登錄頁(yè)面根據(jù)用戶(hù)提交的參數(shù)正3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.entity.User”用戶(hù)實(shí)體類(lèi)3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.enti3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.entity.PersonalInfo”代碼3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.enti3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.servlet.view.LoginPageView”代碼如下:1@WebServlet("/servlet/LoginPageView")2publicclassLoginPageViewextendsHttpServlet{3publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)4 throwsServletException,IOException{5 request.setCharacterEncoding("utf-8");6 response.setContentType("text/html;charset=utf-8");7 PrintWriterout=response.getWriter();8 out.println("<!DOCTYPEHTML>");9 out.println("<HTML>");10 out.println("<HEAD><TITLE>登錄頁(yè)面</TITLE></HEAD>");11 out.println("<BODY>");12 Objecterror=request.getAttribute("error");13 if(error!=null){14 out.println("請(qǐng)重新登錄:<fontcolor='red'>"+error+"</font><br>");15 }16 Stringbody="<formaction='LoginServlet'method='post'>"+17 "username:<inputtype='text'name='username'/><br/>"+18 "password:<inputtype='password'name='password'/><br/>"+19 "<inputtype='submit'value='登錄'/></form>";20 out.println(body);21 out.println("</BODY>");22 out.println("</HTML>");23 out.flush();24 out.close();25 }26 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)27 throwsServletException,IOException{28 doGet(request,response);29 }30}3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.serv3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.servlet.LoginServlet”代碼如下:1@WebServlet("/servlet/LoginServlet")2publicclassLoginServletextendsHttpServlet{3publicStringcheckLogin(Useruser){4 StringerrorInfo=null;5 if(user.getUsername()==null||"".equals(user.getUsername().trim())6 ||user.getPassword()==null||"".equals(user.getPassword().trim())){7 errorInfo="用戶(hù)名或者密碼不能為空";8 }9 returnerrorInfo;10 }11 publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)12 throwsServletException,IOException{13 doPost(request,response);14 }15 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)16 throwsServletException,IOException{17 request.setCharacterEncoding("utf-8");18 Stringusername=request.getParameter("username");19 Stringpassword=request.getParameter("password");20 Useruser=newUser(username,password,newDate());21 Stringerror=checkLogin(user);22 StringtargetPath="IndexView";23 if(error==null){24 //登錄成功,對(duì)登錄信息進(jìn)行保存25

request.setAttribute("username",user);26 }else{27 //登錄失敗,返回登錄頁(yè)面,并將錯(cuò)誤信息帶回28 targetPath="LoginPageView";29 request.setAttribute("error",error);30 }31 request.getRequestDispatcher(targetPath).forward(request,response);32 }33}3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.serv3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.servlet.view.IndexView”代碼如下:1@WebServlet("/servlet/IndexView")2publicclassIndexViewextendsHttpServlet{3publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)4 throwsServletException,IOException{5 ObjectloginTag=request.getAttribute("user");6 if(loginTag==null){ 7 response.sendRedirect("LoginPageView?error="+8 URLEncoder.encode("尚未登錄","gbk"));9 return;10 }11 Useruser=(User)loginTag;12 response.setContentType("text/html;charset=gbk");13 PrintWriterout=response.getWriter();14 out.println("<!DOCTYPEHTML>");15 out.println("<HTML>");16 out.println("<HEAD><TITLE>Web應(yīng)用首頁(yè)</TITLE></HEAD>");17 out.println("<BODY>");18 out.println("當(dāng)前登錄的用戶(hù)是:"+user.getUsername());19 SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");20 out.println("<br>登錄時(shí)間:"+sdf.format(user.getLoginTime()));21 out.println("<br><ahref='IndexView'>進(jìn)入首頁(yè)</a>");22 out.println("<br><ahref='PersonalInfoView'>查看個(gè)人信息</a>");23 out.println("<br><ahref='PersonalPage1'>完善個(gè)人信息</a>");24 out.println("</BODY>");25 out.println("</HTML>");26 out.flush();27 out.close();28 }29 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)30 throwsServletException,IOException{31 doGet(request,response);32 }33}3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.serv3.1.2登錄模塊的實(shí)現(xiàn)假如在圖3.2所示的頁(yè)面中,單擊“進(jìn)入首頁(yè)”的超級(jí)鏈接在該次對(duì)Web首頁(yè)的請(qǐng)求中,將因?yàn)闊o(wú)法獲得登錄者信息而跳轉(zhuǎn)至登錄頁(yè)面,如圖3.8所示。圖3.8跳轉(zhuǎn)至登錄頁(yè)面圖3.2個(gè)人信息首頁(yè)3.1.2登錄模塊的實(shí)現(xiàn)假如在圖3.2所示的頁(yè)面中,單擊“3.2CookieHTTP是一種無(wú)狀態(tài)協(xié)議,即每次服務(wù)端接收到客戶(hù)端的請(qǐng)求時(shí),都是一個(gè)全新的請(qǐng)求,服務(wù)器并不知道客戶(hù)端的歷史請(qǐng)求記錄.如何解決上述問(wèn)題?CookieSession3.2CookieHTTP是一種無(wú)狀態(tài)協(xié)議,即每次服務(wù)端接3.2Cookie3.2.1Cookie簡(jiǎn)介3.2.2Cookie在登錄中的應(yīng)用3.2.3Cookie詳解3.2Cookie3.2.1Cookie簡(jiǎn)介3.2.1Cookie簡(jiǎn)介Cookie實(shí)際上是服務(wù)器在客戶(hù)端瀏覽器上存儲(chǔ)的小段文本,并通過(guò)每一個(gè)請(qǐng)求發(fā)送至同一個(gè)服務(wù)器。Web服務(wù)器用HTTP報(bào)頭向客戶(hù)端發(fā)送Cookie,客戶(hù)端瀏覽器解析這些Cookie并將它們保存為一個(gè)本地文件。服務(wù)器set-cookieuser=admin;Expires=Wen,12-Apr-201704:38-55GMT②③保存Cookie文件④讀取Cookie文件⑤cookieuser=admin客戶(hù)端user=admin&pw=123456&login=auto3.2.1Cookie簡(jiǎn)介Cookie實(shí)際上是服務(wù)器在客3.2.1Cookie簡(jiǎn)介在JavaEE中,使用“javax.servlet.http.Cookie”類(lèi)來(lái)代表一個(gè)Cookie。Cookie對(duì)象可以看作是一個(gè)key-value對(duì),key和value都是String類(lèi)型:publicCookie(Stringname,Stringvalue)3.2.1Cookie簡(jiǎn)介在JavaEE中,使用“ja3.2.1Cookie簡(jiǎn)介客戶(hù)端瀏覽器接收到Cookie并進(jìn)行存儲(chǔ),在后續(xù)的請(qǐng)求中會(huì)自動(dòng)添加這個(gè)Cookie信息,服務(wù)端需要借助于“javax.servlet.http.HttpServletResponse”的addCookie()方法來(lái)獲取客戶(hù)端傳遞來(lái)的Cookie信息,最終實(shí)現(xiàn)信息共享。publicvoidaddCookie(Cookiecookie)3.2.1Cookie簡(jiǎn)介客戶(hù)端瀏覽器接收到Cookie3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:在3.1.2節(jié)中的會(huì)話(huà)問(wèn)題中,服務(wù)器端可以創(chuàng)建Cookie對(duì)象,將用戶(hù)的登錄信息保存在該Cookie對(duì)象中,然后通過(guò)HTTP響應(yīng)消息寫(xiě)回到客戶(hù)端。之后,客戶(hù)端的每次請(qǐng)求都將會(huì)帶上該登錄信息,從而解決會(huì)話(huà)狀態(tài)保持問(wèn)題。將Cookie對(duì)象通過(guò)HTTP響應(yīng)消息寫(xiě)回客戶(hù)端時(shí),首先修改“.zzti.servlet.LoginServlet”類(lèi)的doPost()方法,當(dāng)用戶(hù)登錄系統(tǒng)后,將用戶(hù)的登錄信息通過(guò)HTTP響應(yīng)消息寫(xiě)回客戶(hù)端,修改后的LoginServlet中doPost方法的核心代碼(完整代碼參考P83)如下:7Stringerror=checkLogin(user);8 StringtargetPath="IndexView";9 if(error==null){10 Cookiecookie1=newCookie("username",user.getUsername());11 Cookiecookie2=newCookie("loginTime",user.getLoginTime());12 response.addCookie(cookie1);13 response.addCookie(cookie2);14 }cookie保存會(huì)話(huà)登錄模塊示例源碼:loginDemo(ch3-2)3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:73.2.2Cookie在登錄中的應(yīng)用登錄解決思路:在“javax.servlet.http.HttpServletRequest”中提供了getCookies()方法,該方法可以獲取HTTP請(qǐng)求所發(fā)送的所有Cookie信息,因?yàn)榭蛻?hù)端發(fā)送的Cookie可以是0到多個(gè),所以getCookies方法返回的是Cookie數(shù)組。在工程中添加類(lèi)“.zzti.util.CookieUtil”來(lái)完成對(duì)Cookie的訪(fǎng)問(wèn),具體代碼如下。 /** *從cookie數(shù)組中查詢(xún)鍵值為key的Cookie對(duì)象 *@paramcookies *@paramkey *@return */ publicstaticCookiegetCookie(Cookie[]cookies,Stringkey){ if(cookies!=null){ for(Cookiecookie:cookies){ if(key!=null&&key.equals(cookie.getName())){ returncookie; } } } returnnull; }3.2.2Cookie在登錄中的應(yīng)用登錄解決思路: /**3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:在“javax.servlet.http.HttpServletRequest”中提供了getCookies()方法,該方法可以獲取HTTP請(qǐng)求所發(fā)送的所有Cookie信息,因?yàn)榭蛻?hù)端發(fā)送的Cookie可以是0到多個(gè),所以getCookies方法返回的是Cookie數(shù)組。在工程中添加類(lèi)“.zzti.util.CookieUtil”來(lái)完成對(duì)Cookie的訪(fǎng)問(wèn),具體代碼如下。/** *從cookie數(shù)組中查詢(xún)鍵值為key的Cookie的value值 *@paramkey *@paramcookies *@return */ publicstaticStringgetValue(Stringkey,Cookie[]cookies){ if(cookies!=null){ for(Cookiecookie:cookies){ if(key!=null&&key.equals(cookie.getName())){ returncookie.getValue(); } } } returnnull; }3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:改寫(xiě)“.zzti.servlet.IndexView”類(lèi)的doPost方法,增加登錄判斷的相關(guān)代碼,具體實(shí)現(xiàn)如下。publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)2 throwsServletException,IOException{3request.setCharacterEncoding("gbk");4 Cookie[]cookies=request.getCookies();5 if(CookieUtil.getValue("username",cookies)==null){ 6 response.sendRedirect("LoginPageView?error="+URLEncoder.7 encode("尚未登錄","utf-8"));8 return;9 }10 Stringusername=CookieUtil.getValue("username",cookies);11 StringloginTime=CookieUtil.getValue("logintime",cookies);12 response.setContentType("text/html;charset=utf-8");13 PrintWriterout=response.getWriter();14 out.println("<!DOCTYPEHTML>");15 out.println("<HTML>");16 out.println("<HEAD><TITLE>Web應(yīng)用首頁(yè)</TITLE></HEAD>");17 out.println("<BODY>");18 out.println("當(dāng)前登錄的用戶(hù)是:"+username);19 out.println("<br>登錄時(shí)間:"+loginTime);20 out.println("<br><ahref='IndexView'>進(jìn)入首頁(yè)</a>");21 out.println("</BODY>");22 out.println("</HTML>");23 out.flush();24 out.close();25}3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:publ3.2.3Cookie詳解Cookie本身是保存在客戶(hù)端瀏覽器中的一段文本,Cookie能否成功存儲(chǔ)取決于瀏覽器的設(shè)置。3.2.3Cookie詳解Cookie本身是保存在客戶(hù)端瀏3.2.3Cookie詳解Cookie的內(nèi)容主要包括名字、值、過(guò)期時(shí)間、路徑和域。路徑與域一起構(gòu)成了Cookie的作用范圍。3.2.3Cookie詳解Cookie的內(nèi)容主要包括名字、3.2.3Cookie詳解JavaEE中的javax.servlet.http.Cookie類(lèi)提供了對(duì)Cookie的上述各個(gè)屬性進(jìn)行操作的API,如表3.1所示。序號(hào)方法描述1Cookie(String

name,

String

value)實(shí)例化Cookie對(duì)象2public

String

getName()取得Cookie的名字3public

String

getValue()取得Cookie的值4public

void

setValue(String

newValue)設(shè)置Cookie的值5public

void

setMaxAge(int

expiry)設(shè)置Cookie的最大保存時(shí)間,即Cookie有效期6publicintgetMaxAge()獲取Cookies的有效期7publicvoidsetPath(String

uri)設(shè)置Cookies的有效路徑8public

String

getPath()獲取Cookies的有效路徑9publicvoidsetDomain(String

pattern)設(shè)置Cookies的有效域10publicStringgetDomain()獲取Cookies的有效域表3.1 Cookie的API3.2.3Cookie詳解JavaEE中的javax.s3.2.3Cookie詳解利用以上API完成有效時(shí)間和有效域的設(shè)置,詳見(jiàn)P88。3.2.3Cookie詳解利用以上API完成有效時(shí)間和有效3.3Session通過(guò)Cookie實(shí)現(xiàn)了登錄信息共享問(wèn)題,但是該方法主要是依靠客戶(hù)端瀏覽器開(kāi)發(fā)及服務(wù)器端Cookie寫(xiě)入的功能。如果客戶(hù)端瀏覽器不接收任何Cookie,那么就無(wú)法實(shí)現(xiàn)登錄信息的共享。如何解決上述問(wèn)題?Session3.3Session通過(guò)Cookie實(shí)現(xiàn)了登錄信息共享問(wèn)題3.3Session3.3.1HttpSession簡(jiǎn)介3.3.2HttpSession在登錄中的應(yīng)用3.3.3HttpSession詳解3.3Session3.3.1HttpSession簡(jiǎn)3.3.1HttpSession簡(jiǎn)介HttpSession對(duì)象是Session概念在JavaWeb中的具體實(shí)現(xiàn),通過(guò)這個(gè)對(duì)象可以實(shí)現(xiàn)服務(wù)端同一會(huì)話(huà)的多次請(qǐng)求之間的數(shù)據(jù)共享。HttpSession對(duì)象是通過(guò)HttpServletRequest獲得的,HttpServletRequest共包含兩個(gè)獲取HttpSession對(duì)象的方法,如下所示:publicHttpSessiongetSession(booleancreate)publicHttpSessiongetSession()3.3.1HttpSession簡(jiǎn)介HttpSession3.3.1HttpSession簡(jiǎn)介其中,getSession(true)與getSession()的含義相同,如果當(dāng)前reqeust中的HttpSession為null,當(dāng)create變量的值為true時(shí),就創(chuàng)建一個(gè)新的HttpSession對(duì)象,否則返回當(dāng)前HttpSession對(duì)象。getSession(false)的含義是,如果當(dāng)前reqeust中的HttpSession為null,返回null,否則返回當(dāng)前HttpSession對(duì)象。3.3.1HttpSession簡(jiǎn)介3.3.1HttpSession簡(jiǎn)介HttpSession用于會(huì)話(huà)管理的4個(gè)方法為:publicvoidsetAttribute(Stringname,Objectvalue)publicObjectgetAttribute(Stringname)publicEnumerationgetAttributeNames()publicObjectremoveAttribute(Stringname)getAttribute(Stringname,Objectvalue)其中,getAttribute(Stringname,Objectvalue)方法與HttpServletRequest對(duì)象的setAttribute(Stringname,Objectvalue)方法作用一致,都是將一個(gè)對(duì)象存放于某個(gè)空間,以方便對(duì)象在資源之間進(jìn)行共享。兩者之間的區(qū)別在于,HttpServletRequest對(duì)象存儲(chǔ)的數(shù)據(jù)只能在同一次請(qǐng)求的不同資源之間實(shí)現(xiàn)共享,而HttpSession對(duì)象存儲(chǔ)的數(shù)據(jù)可以在同一個(gè)會(huì)話(huà)的不同請(qǐng)求之間進(jìn)行共享,數(shù)據(jù)共享的范圍更為廣泛。3.3.1HttpSession簡(jiǎn)介HttpSession3.3.1HttpSession簡(jiǎn)介思考:實(shí)現(xiàn)一個(gè)Servlet類(lèi)SessionDemo1。在該類(lèi)中獲得當(dāng)前會(huì)話(huà)的HttpSession對(duì)象,并在這個(gè)HttpSession對(duì)象中存儲(chǔ)一個(gè)key為“info”的字符串對(duì)象“存放于session中的信息”,并提供一個(gè)超級(jí)鏈接,訪(fǎng)問(wèn)另外一個(gè)Servlet資源,以方便發(fā)送一個(gè)新的請(qǐng)求,具體代碼如P93。Session保存會(huì)話(huà)登錄模塊示例源碼:loginDemo(ch3-3)3.3.1HttpSession簡(jiǎn)介思考:Session保3.3.2HttpSession在登錄中的應(yīng)用當(dāng)一個(gè)瀏覽器窗口發(fā)出一個(gè)請(qǐng)求,并且Web應(yīng)用服務(wù)第一次調(diào)用HttpServletRequest的getSession()或者getSession(true)的時(shí)候,當(dāng)前瀏覽器窗口與Web應(yīng)用服務(wù)之間建立了會(huì)話(huà)。在默認(rèn)情況下,只要當(dāng)前建立會(huì)話(huà)的瀏覽器窗口沒(méi)有關(guān)閉,該會(huì)話(huà)就不會(huì)結(jié)束。因此,若要在瀏覽器與Web應(yīng)用服務(wù)之間保持會(huì)話(huà)信息,可以使用HttpSession來(lái)保存請(qǐng)求之間的相關(guān)信息。3.3.2HttpSession在登錄中的應(yīng)用當(dāng)一個(gè)瀏覽器3.3.2HttpSession在登錄中的應(yīng)用在第3.1.2節(jié)中,出現(xiàn)的登錄信息的保持問(wèn)題,在這里就可以使用HttpSession進(jìn)行解決。用戶(hù)登錄信息被提交給.zzti.servlet.LoginServlet時(shí),LoginServlet將該登錄信息存儲(chǔ)至HttpSession中,這樣在當(dāng)前瀏覽器窗口下,發(fā)送的所有請(qǐng)求都可以共享HttpSession中的登錄信息,具體代碼實(shí)現(xiàn)如下。3.3.2HttpSession在登錄中的應(yīng)用在第.2HttpSession在登錄中的應(yīng)用1@WebServlet("/servlet/LoginServlet")2publicclassLoginServletextendsHttpServlet{3publicStringcheckLogin(Useruser){/*代碼略,看第3.1.2節(jié)*/ }4publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)5 throwsServletException,IOException{6 request.setCharacterEncoding("utf-8");7 Stringusername=request.getParameter("username");8 Stringpassword=request.getParameter("password");9 Useruser=newUser(username,password,newDate());10 Stringerror=checkLogin(user);11 StringtargetPath="IndexView";12 if(error==null){13 //將獲取的登錄信息存在HttpSession中14 request.getSession().setAttribute("user",user);15 }else{16 //登錄失敗,返回登錄頁(yè)面,并將錯(cuò)誤信息帶回17 targetPath="LoginPageView";18 request.setAttribute("error",error);19 }20 request.getRequestDispatcher(targetPath).forward(request,response);21 }22/*代碼略,請(qǐng)查看第3.1.2節(jié)*/23}3.3.2HttpSession在登錄中的應(yīng)用1@W3.3.3HttpSession詳解序號(hào)方法名說(shuō)明1ObjectgetAttribute(Stringname)用于從當(dāng)前HttpSession對(duì)象中返回指定名稱(chēng)的屬性對(duì)象2EnumerationgetAttributeNames()返回和會(huì)話(huà)有關(guān)的枚舉值3StringgetId()返回分配給這個(gè)Session的標(biāo)識(shí)符。一個(gè)HTTP

session的標(biāo)識(shí)符是一個(gè)由服務(wù)器來(lái)建立和維持的唯一的字符串4intgetMaxInactiveInterval()用于獲得當(dāng)前HttpSession對(duì)象可空閑的以秒為單位的最長(zhǎng)時(shí)間5ObjectgetValue(Stringname)獲取指定名稱(chēng)的Session對(duì)象。如果不存在這樣的綁定,返回空值6String[]getValueNames()以一個(gè)數(shù)組返回綁定到Session上的所有數(shù)據(jù)的名稱(chēng)7booleanisNew()判斷當(dāng)前HttpSession對(duì)象是否是新創(chuàng)建的8voidremoveAttribute(Stringname)用于從當(dāng)前HttpSession對(duì)象中刪除指定名稱(chēng)的屬性9voidremoveValue(Stringname)取消指定名稱(chēng)在Session上的綁定10voidsetAttribute(Stringname,Objectvalue)用于將一個(gè)對(duì)象與一個(gè)名稱(chēng)關(guān)聯(lián)后存儲(chǔ)到當(dāng)前的HttpSession對(duì)象中11voidsetMaxInactiveInterval(int

interval)用于設(shè)置當(dāng)前HttpSession對(duì)象可空閑的最長(zhǎng)時(shí)間,以秒為單位。也就是修改當(dāng)前會(huì)話(huà)的默認(rèn)超時(shí)間隔3.3.3HttpSession詳解序號(hào)方法名說(shuō)3.4

Session工作原理與Cookie不同,Session采用在服務(wù)器端保持狀態(tài)的解決方案。Session是針對(duì)每一個(gè)用戶(hù)的,變量的值保存在服務(wù)器上,用一個(gè)sessionID來(lái)區(qū)分是哪個(gè)用戶(hù)的Session變量,這個(gè)值是通過(guò)用戶(hù)瀏覽器在訪(fǎng)問(wèn)的時(shí)候返回給服務(wù)器,當(dāng)客戶(hù)禁用Cookie時(shí),這個(gè)值也能設(shè)置為get來(lái)返回給服務(wù)器。3.4Session工作原理與Cookie不同,Sessi3.4

Session工作原理就安全性來(lái)說(shuō),當(dāng)訪(fǎng)問(wèn)一個(gè)使用Session的站點(diǎn)時(shí),需要在自己的計(jì)算機(jī)中建立一個(gè)Cookie。因此,為安全起見(jiàn),用戶(hù)使用時(shí)建議采用服務(wù)器端的Session機(jī)制,因?yàn)樗粫?huì)任意讀取客戶(hù)存儲(chǔ)的信息。HttpSession在實(shí)際工作中是依靠Cookie來(lái)實(shí)現(xiàn)的,Cookie在HttpSession的工作中起到保護(hù)數(shù)據(jù)的作用3.4Session工作原理就安全性來(lái)說(shuō),當(dāng)訪(fǎng)問(wèn)一個(gè)使用S3.5

個(gè)人信息模塊的實(shí)現(xiàn)圖3.3完善個(gè)人信息1圖3.4完善個(gè)人信息2圖3.5查看個(gè)人信息詳情3.5個(gè)人信息模塊的實(shí)現(xiàn)圖3.3完善個(gè)人信息1圖3.43.5

個(gè)人信息模塊的實(shí)現(xiàn)首先,需要新建一個(gè)完善個(gè)人信息表單頁(yè)面“.zn.servlet.view.PersonalPage1”,表單效果如圖3.3所示,并在當(dāng)前頁(yè)面中同樣顯示登錄信息,具體代碼如P98。在“.zn.servlet.view.PersonalPage1”中填寫(xiě)的個(gè)人信息表單并不完整,還需要與一個(gè)完善個(gè)人信息表單頁(yè)面“.zn.servlet.view.PersonalPage2”中的數(shù)據(jù)整合后,才能變成完整的用戶(hù)個(gè)人信息。表單效果如圖3.4所示,并在當(dāng)前頁(yè)面中同樣顯示登錄信息,具體代碼如P99示例源碼:loginDemo(ch3-5)3.5個(gè)人信息模塊的實(shí)現(xiàn)首先,需要新建一個(gè)完善個(gè)人信息表單3.5

個(gè)人信息模塊的實(shí)現(xiàn)在“.zzti.servlet.PersonalServlet”類(lèi)中對(duì)用戶(hù)填寫(xiě)的所有表單數(shù)據(jù)進(jìn)行封裝、存儲(chǔ).1@WebServlet("/servlet/PersonalInfoProcess")2publicclassPersonalInfoProcessextendsHttpServlet{7 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)8 throwsServletException,IOException{9 request.setCharacterEncoding("utf-8");10 ObjectloginTag=request.getSession().getAttribute("user");11 if(loginTag==null){ 12 response.sendRedirect("LoginPageView");13 return;14 }15 Useruser=(User)loginTag;16 ObjectpersonalObject=request.getSession().getAttribute("p");17 if(personalObject==null){18 request.setAttribute("info","您還沒(méi)有完善個(gè)人信息,請(qǐng)進(jìn)行完善");19 request.getRequestDispatcher("PersonalPage1").forward(request,response);20 return;21 }else{22 StringtargetPath="PersonalInfoView";23 PersonalInfop=(PersonalInfo)request.getSession().getAttribute("p");24 p.setHighestEducation(request.getParameter("highestEducation"));25 p.setGraduateSchool(request.getParameter("graduateSchool"));26 p.setMajor("major");27 response.sendRedirect(targetPath);//使用跳轉(zhuǎn)重定向到展示頁(yè)28 }29 }30}3.5個(gè)人信息模塊的實(shí)現(xiàn)在“.zzti.ser3.6

基于MVC的臨時(shí)購(gòu)物車(chē)1979年,TrygveReenskaug首次提出了MVC的概念,最初的時(shí)候叫作Model-View-Controller-Editor。TrygveReenskaug最初提出MVC的目的是為了把模型與視圖分離開(kāi)來(lái),然后用控制器來(lái)組合Model和View之間的關(guān)系。這樣做的目的是實(shí)現(xiàn)注意點(diǎn)分離的設(shè)計(jì)理念,也就是讓專(zhuān)業(yè)的對(duì)象做專(zhuān)業(yè)的事情,View負(fù)責(zé)視圖相關(guān)的內(nèi)容,Model負(fù)責(zé)描述數(shù)據(jù)模型,Controller負(fù)責(zé)總控,各自分工協(xié)作。3.6基于MVC的臨時(shí)購(gòu)物車(chē)1979年,TrygveRe3.6基于MVC的臨時(shí)購(gòu)物車(chē)3.6.1臨時(shí)購(gòu)物車(chē)設(shè)計(jì)需求3.6.2臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)3.6.3Cookie詳解3.6基于MVC的臨時(shí)購(gòu)物車(chē)3.6.1臨時(shí)購(gòu)物車(chē)設(shè)計(jì)需3.6.1

臨時(shí)購(gòu)物車(chē)設(shè)計(jì)需求在臨時(shí)購(gòu)物車(chē)中,需要購(gòu)買(mǎi)的商品列表頁(yè)面如圖3.21所示。每個(gè)商品均包含有商品序號(hào)、商品名稱(chēng)和商品價(jià)格等信息。任意用戶(hù)在商品列表頁(yè)面都可以對(duì)商品進(jìn)行購(gòu)買(mǎi)。每當(dāng)用戶(hù)對(duì)某個(gè)商品輸入購(gòu)買(mǎi)數(shù)量后,單擊“加入購(gòu)物車(chē)”按鈕,就會(huì)轉(zhuǎn)向臨時(shí)購(gòu)物車(chē)頁(yè)面,實(shí)現(xiàn)效果如圖3.22所示。如果用戶(hù)需要繼續(xù)購(gòu)買(mǎi),則可以通過(guò)一個(gè)超級(jí)鏈接返回商品列表頁(yè)面,也可以對(duì)購(gòu)物車(chē)中的現(xiàn)有商品進(jìn)行刪除操作。圖3.21商品列表圖3.22臨時(shí)購(gòu)物車(chē)列表臨時(shí)購(gòu)物車(chē)示例源碼:loginDemo(ch3-6)3.6.1臨時(shí)購(gòu)物車(chē)設(shè)計(jì)需求在臨時(shí)購(gòu)物車(chē)中,需要購(gòu)買(mǎi)的商品3.6.2

臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)首先,對(duì)臨時(shí)購(gòu)物車(chē)中的數(shù)據(jù)模型(Model)進(jìn)行分析。為了表示商品對(duì)象,需要定義商品類(lèi)Goods,包含商品名稱(chēng)、價(jià)格、數(shù)量等私有屬性及其相應(yīng)的get和set方法,具體實(shí)現(xiàn)代碼如下所示。1publicclassGoods{2 privateStringname;3 privatefloatprice;4 privateintnumber;5 publicStringgetName(){6 returnname;7 }8 publicvoidsetName(Stringname){9 =name;10 }11 publicfloatgetPrice(){12 returnprice;13 }14 publicvoidsetPrice(floatprice){15 this.price=price;16 }17 publicintgetNumber(){18 returnnumber;19 }20 publicvoidsetNumber(intnumber){21 this.number=number;22 }23}3.6.2臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)首先,對(duì)臨時(shí)購(gòu)物車(chē)中的數(shù)據(jù)模型3.6.2

臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)為了在頁(yè)面中展示商品列表,定義GoodsStore類(lèi),完成商品信息的初始化工作。此處,采用ArrayList對(duì)象進(jìn)行存儲(chǔ),并將其放在靜態(tài)代碼塊中,保證代碼的優(yōu)先執(zhí)行。具體實(shí)現(xiàn)代碼如下所示。1publicclassGoodsStore{2publicstaticList<Goods>goodsList=newArrayList<Goods>();3static{4 for(inti=0;i<10;i++){5 goodsList.add(newGoods("商品"+(i+1),50+i*10,0));6 }7 }8}3.6.2臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)為了在頁(yè)面中展示商品列表,定義3.6.2

臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)定義好相關(guān)數(shù)據(jù)模型后,接下來(lái)定義商品列表展示頁(yè)面,即完成臨時(shí)購(gòu)物車(chē)中視圖(View)層的展示。因此,定義GoodsList類(lèi)并使其繼承HttpServlet,進(jìn)行商品列表信息的頁(yè)面展示。臨時(shí)購(gòu)物車(chē)中每個(gè)商品都可以加入購(gòu)物車(chē),當(dāng)用戶(hù)單擊“加入購(gòu)物車(chē)”按鈕時(shí),將其交給臨時(shí)購(gòu)物車(chē)中的控制層,即在代碼中定義“加入購(gòu)物車(chē)”的action為“ShopCardController?type=addCard”。類(lèi)似的,當(dāng)用戶(hù)在頁(yè)面中單擊“查看購(gòu)物車(chē)”超鏈接時(shí),將其轉(zhuǎn)交給控制層,即將“查看購(gòu)物車(chē)”的超鏈接定義為“<ahref=‘ShopCardController?type=cardList’>查看購(gòu)物車(chē)</a>”。具體代碼如P105所示。根據(jù)MVC的設(shè)計(jì)理念,控制層負(fù)責(zé)數(shù)據(jù)模型和視圖的交互。在臨時(shí)購(gòu)物車(chē)的商品列表頁(yè)面中,當(dāng)用戶(hù)單擊“加入購(gòu)物車(chē)”按鈕后,會(huì)將當(dāng)前的商品所在表單提交給ShopCardController。該類(lèi)的具體代碼如P106所示。3.6.2臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)定義好相關(guān)數(shù)據(jù)模型后,接下來(lái)定3.6.2

臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)用戶(hù)在商品列表中選擇商品后進(jìn)入購(gòu)物車(chē)頁(yè)面,可以查看購(gòu)物車(chē)中所選擇的商品列表。購(gòu)物車(chē)ShopCard類(lèi)的代碼如P107。3.6.2臨時(shí)購(gòu)物車(chē)代碼實(shí)現(xiàn)用戶(hù)在商品列表中選擇商品后進(jìn)入第3章Cookie與Session

第3章Cookie與Session本章內(nèi)容

基于Servlet的簡(jiǎn)單Web應(yīng)用

Cookie的含義和用法

Session的含義和用法

Session的工作原理個(gè)人信息模塊的實(shí)現(xiàn)基于MVC的購(gòu)物車(chē)本章內(nèi)容基于Servlet的簡(jiǎn)單Web應(yīng)用3.1使用Servlet編寫(xiě)簡(jiǎn)單Web應(yīng)用使用Servlet開(kāi)發(fā)一個(gè)模擬登錄的Web應(yīng)用主要功能登錄個(gè)人信息的完善和查詢(xún)3.1使用Servlet編寫(xiě)簡(jiǎn)單Web應(yīng)用使用Servl3.1使用Servlet編寫(xiě)簡(jiǎn)單Web應(yīng)用3.1.1Web應(yīng)用功能說(shuō)明3.1.2登錄模塊的實(shí)現(xiàn)3.1使用Servlet編寫(xiě)簡(jiǎn)單Web應(yīng)用3.1.1We3.1.1Web應(yīng)用功能說(shuō)明圖3.1登錄頁(yè)面圖3.2個(gè)人信息首頁(yè)用戶(hù)可通過(guò)圖3.1所示的登錄頁(yè)面填寫(xiě)用戶(hù)名和密碼進(jìn)行登錄操作,如果用戶(hù)名和密碼都不為空,則判定該登錄有效,顯示如圖3.2所示的個(gè)人信息應(yīng)用首頁(yè),該首頁(yè)不僅顯示了當(dāng)前用戶(hù)的個(gè)人信息的頁(yè)面鏈接,以及完善個(gè)人信息的頁(yè)面鏈接,還顯示了當(dāng)前的登錄用戶(hù)名,以及登錄時(shí)間信息3.1.1Web應(yīng)用功能說(shuō)明圖3.1登錄頁(yè)面圖Web應(yīng)用功能說(shuō)明當(dāng)點(diǎn)擊“查看個(gè)人信息”鏈接時(shí),系統(tǒng)應(yīng)顯示當(dāng)前登錄用戶(hù)完善后的個(gè)人信息。如果該用戶(hù)從來(lái)沒(méi)有點(diǎn)擊“完善個(gè)人信息”鏈接,則需要對(duì)信息進(jìn)行完善,此時(shí)系統(tǒng)會(huì)直接跳轉(zhuǎn)至“完善個(gè)人信息”頁(yè)面,如圖3.3和圖3.4所示。圖3.3完善個(gè)人信息1圖3.4完善個(gè)人信息23.1.1Web應(yīng)用功能說(shuō)明當(dāng)點(diǎn)擊“查看個(gè)人信息”鏈接時(shí),3.1.1Web應(yīng)用功能說(shuō)明如果當(dāng)前用戶(hù)已經(jīng)完善過(guò)個(gè)人信息,則直接顯示完善后的用戶(hù)信息,如圖3.5所示。圖3.5查看個(gè)人信息詳情3.1.1Web應(yīng)用功能說(shuō)明如果當(dāng)前用戶(hù)已經(jīng)完善過(guò)個(gè)人信息3.1.2登錄模塊的實(shí)現(xiàn)工程結(jié)構(gòu)如圖3.6圖3.6LoginDemo工程結(jié)構(gòu)1.“.zzti.entity”包中包含User和PersonalInfo兩個(gè)實(shí)體類(lèi),分別用來(lái)存儲(chǔ)用戶(hù)的登錄信息和當(dāng)前登錄用戶(hù)的具體個(gè)人信息2.“.zzti.servlet.view”包中存放展現(xiàn)給用戶(hù)的5個(gè)頁(yè)面,包括登錄頁(yè)面、Web應(yīng)用首頁(yè)、個(gè)人信息完善表單1、個(gè)人信息完善表單2、個(gè)人信息詳情頁(yè)面。3.“.zzti.servlet”包中包含兩個(gè)Servlet,“LoginServlet”的主要功能是對(duì)來(lái)自登錄頁(yè)面中的表單參數(shù)進(jìn)行校驗(yàn)和存儲(chǔ),“PersonalInfoProcess”的主要功能是接收來(lái)自個(gè)人信息完善表單中的數(shù)據(jù),對(duì)完善后的個(gè)人信息進(jìn)行封裝和存儲(chǔ)。3.1.2登錄模塊的實(shí)現(xiàn)工程結(jié)構(gòu)如圖3.6圖3.6Lo3.1.2登錄模塊的實(shí)現(xiàn)本章的登錄頁(yè)面根據(jù)用戶(hù)提交的參數(shù)正確與否來(lái)產(chǎn)生不同的響應(yīng),如果用戶(hù)名密碼都不為空,則跳轉(zhuǎn)到圖3.2;否則,跳轉(zhuǎn)到,如圖3.7所示的登錄頁(yè)面,并提示錯(cuò)誤信息。圖3.7登錄異常響應(yīng)結(jié)果頁(yè)面登錄模塊示例源碼:loginDemo(ch3-1)3.1.2登錄模塊的實(shí)現(xiàn)本章的登錄頁(yè)面根據(jù)用戶(hù)提交的參數(shù)正3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.entity.User”用戶(hù)實(shí)體類(lèi)3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.enti3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.entity.PersonalInfo”代碼3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.enti3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.servlet.view.LoginPageView”代碼如下:1@WebServlet("/servlet/LoginPageView")2publicclassLoginPageViewextendsHttpServlet{3publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)4 throwsServletException,IOException{5 request.setCharacterEncoding("utf-8");6 response.setContentType("text/html;charset=utf-8");7 PrintWriterout=response.getWriter();8 out.println("<!DOCTYPEHTML>");9 out.println("<HTML>");10 out.println("<HEAD><TITLE>登錄頁(yè)面</TITLE></HEAD>");11 out.println("<BODY>");12 Objecterror=request.getAttribute("error");13 if(error!=null){14 out.println("請(qǐng)重新登錄:<fontcolor='red'>"+error+"</font><br>");15 }16 Stringbody="<formaction='LoginServlet'method='post'>"+17 "username:<inputtype='text'name='username'/><br/>"+18 "password:<inputtype='password'name='password'/><br/>"+19 "<inputtype='submit'value='登錄'/></form>";20 out.println(body);21 out.println("</BODY>");22 out.println("</HTML>");23 out.flush();24 out.close();25 }26 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)27 throwsServletException,IOException{28 doGet(request,response);29 }30}3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.serv3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.servlet.LoginServlet”代碼如下:1@WebServlet("/servlet/LoginServlet")2publicclassLoginServletextendsHttpServlet{3publicStringcheckLogin(Useruser){4 StringerrorInfo=null;5 if(user.getUsername()==null||"".equals(user.getUsername().trim())6 ||user.getPassword()==null||"".equals(user.getPassword().trim())){7 errorInfo="用戶(hù)名或者密碼不能為空";8 }9 returnerrorInfo;10 }11 publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)12 throwsServletException,IOException{13 doPost(request,response);14 }15 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)16 throwsServletException,IOException{17 request.setCharacterEncoding("utf-8");18 Stringusername=request.getParameter("username");19 Stringpassword=request.getParameter("password");20 Useruser=newUser(username,password,newDate());21 Stringerror=checkLogin(user);22 StringtargetPath="IndexView";23 if(error==null){24 //登錄成功,對(duì)登錄信息進(jìn)行保存25

request.setAttribute("username",user);26 }else{27 //登錄失敗,返回登錄頁(yè)面,并將錯(cuò)誤信息帶回28 targetPath="LoginPageView";29 request.setAttribute("error",error);30 }31 request.getRequestDispatcher(targetPath).forward(request,response);32 }33}3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.serv3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.servlet.view.IndexView”代碼如下:1@WebServlet("/servlet/IndexView")2publicclassIndexViewextendsHttpServlet{3publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)4 throwsServletException,IOException{5 ObjectloginTag=request.getAttribute("user");6 if(loginTag==null){ 7 response.sendRedirect("LoginPageView?error="+8 URLEncoder.encode("尚未登錄","gbk"));9 return;10 }11 Useruser=(User)loginTag;12 response.setContentType("text/html;charset=gbk");13 PrintWriterout=response.getWriter();14 out.println("<!DOCTYPEHTML>");15 out.println("<HTML>");16 out.println("<HEAD><TITLE>Web應(yīng)用首頁(yè)</TITLE></HEAD>");17 out.println("<BODY>");18 out.println("當(dāng)前登錄的用戶(hù)是:"+user.getUsername());19 SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");20 out.println("<br>登錄時(shí)間:"+sdf.format(user.getLoginTime()));21 out.println("<br><ahref='IndexView'>進(jìn)入首頁(yè)</a>");22 out.println("<br><ahref='PersonalInfoView'>查看個(gè)人信息</a>");23 out.println("<br><ahref='PersonalPage1'>完善個(gè)人信息</a>");24 out.println("</BODY>");25 out.println("</HTML>");26 out.flush();27 out.close();28 }29 publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)30 throwsServletException,IOException{31 doGet(request,response);32 }33}3.1.2登錄模塊的實(shí)現(xiàn)“.zzti.serv3.1.2登錄模塊的實(shí)現(xiàn)假如在圖3.2所示的頁(yè)面中,單擊“進(jìn)入首頁(yè)”的超級(jí)鏈接在該次對(duì)Web首頁(yè)的請(qǐng)求中,將因?yàn)闊o(wú)法獲得登錄者信息而跳轉(zhuǎn)至登錄頁(yè)面,如圖3.8所示。圖3.8跳轉(zhuǎn)至登錄頁(yè)面圖3.2個(gè)人信息首頁(yè)3.1.2登錄模塊的實(shí)現(xiàn)假如在圖3.2所示的頁(yè)面中,單擊“3.2CookieHTTP是一種無(wú)狀態(tài)協(xié)議,即每次服務(wù)端接收到客戶(hù)端的請(qǐng)求時(shí),都是一個(gè)全新的請(qǐng)求,服務(wù)器并不知道客戶(hù)端的歷史請(qǐng)求記錄.如何解決上述問(wèn)題?CookieSession3.2CookieHTTP是一種無(wú)狀態(tài)協(xié)議,即每次服務(wù)端接3.2Cookie3.2.1Cookie簡(jiǎn)介3.2.2Cookie在登錄中的應(yīng)用3.2.3Cookie詳解3.2Cookie3.2.1Cookie簡(jiǎn)介3.2.1Cookie簡(jiǎn)介Cookie實(shí)際上是服務(wù)器在客戶(hù)端瀏覽器上存儲(chǔ)的小段文本,并通過(guò)每一個(gè)請(qǐng)求發(fā)送至同一個(gè)服務(wù)器。Web服務(wù)器用HTTP報(bào)頭向客戶(hù)端發(fā)送Cookie,客戶(hù)端瀏覽器解析這些Cookie并將它們保存為一個(gè)本地文件。服務(wù)器set-cookieuser=admin;Expires=Wen,12-Apr-201704:38-55GMT②③保存Cookie文件④讀取Cookie文件⑤cookieuser=admin客戶(hù)端user=admin&pw=123456&login=auto3.2.1Cookie簡(jiǎn)介Cookie實(shí)際上是服務(wù)器在客3.2.1Cookie簡(jiǎn)介在JavaEE中,使用“javax.servlet.http.Cookie”類(lèi)來(lái)代表一個(gè)Cookie。Cookie對(duì)象可以看作是一個(gè)key-value對(duì),key和value都是String類(lèi)型:publicCookie(Stringname,Stringvalue)3.2.1Cookie簡(jiǎn)介在JavaEE中,使用“ja3.2.1Cookie簡(jiǎn)介客戶(hù)端瀏覽器接收到Cookie并進(jìn)行存儲(chǔ),在后續(xù)的請(qǐng)求中會(huì)自動(dòng)添加這個(gè)Cookie信息,服務(wù)端需要借助于“javax.servlet.http.HttpServletResponse”的addCookie()方法來(lái)獲取客戶(hù)端傳遞來(lái)的Cookie信息,最終實(shí)現(xiàn)信息共享。publicvoidaddCookie(Cookiecookie)3.2.1Cookie簡(jiǎn)介客戶(hù)端瀏覽器接收到Cookie3.2.2Cookie在登錄中的應(yīng)用登錄解決思路:在3.1.2節(jié)中的會(huì)話(huà)問(wèn)題中,服務(wù)器端可以創(chuàng)建Cookie對(duì)象,將用戶(hù)的登錄信息保存在該Cookie對(duì)象中,然后通過(guò)HTTP響應(yīng)消息寫(xiě)回到客戶(hù)端。之后,客戶(hù)端的每次請(qǐng)求都將會(huì)帶上該登錄信息,從而解決會(huì)話(huà)狀態(tài)保持問(wèn)題。將Cookie對(duì)象通過(guò)HTTP響應(yīng)消息寫(xiě)回客戶(hù)端時(shí),首先修改“.zzti.servlet.LoginServlet”類(lèi)的doPost()方法,當(dāng)用戶(hù)登錄系統(tǒng)后,將用戶(hù)的登錄信息通過(guò)HTTP響應(yīng)消息寫(xiě)回客戶(hù)端,修改后的LoginServlet中doPost方法的核心代碼(完整代碼參考P83)如下:7Stringerror=checkLogin(user);8 StringtargetPath="IndexView";9 if(error==null){10 Cookiecookie1=newCookie("username",user.getUsername());11 Cookiecookie2=newCookie("loginTime",user.getLoginTime());12

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論