版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JavaWeb學(xué)習(xí)總結(jié)(十二)——Session一、Session簡(jiǎn)單介紹在WEB開發(fā)中,服務(wù)器可以為每個(gè)用戶瀏覽器創(chuàng)建一個(gè)會(huì)話對(duì)象(session對(duì)象),注意:一個(gè)瀏覽器獨(dú)占一個(gè)session對(duì)象(默認(rèn)情況下)。因此,在需要保存用戶數(shù)據(jù)時(shí),服務(wù)器程序可以把用戶數(shù)據(jù)寫到用戶瀏覽器獨(dú)占的session中,當(dāng)用戶使用瀏覽器訪問其它程序時(shí),其它程序可以從用戶的session中取出該用戶的數(shù)據(jù),為用戶服務(wù)。二、Session和Cookie的主要區(qū)別Cookie是把用戶的數(shù)據(jù)寫給用戶的瀏覽器。Session技術(shù)把用戶的數(shù)據(jù)寫到用戶獨(dú)占的session中。Session對(duì)象由服務(wù)器創(chuàng)建,開發(fā)人員可以調(diào)用request對(duì)象的getSession方法得到session對(duì)象。三、session實(shí)現(xiàn)原理3.1、服務(wù)器是如何實(shí)現(xiàn)一個(gè)session為一個(gè)用戶瀏覽器服務(wù)的?
服務(wù)器創(chuàng)建session出來(lái)后,會(huì)把session的id號(hào),以cookie的形式回寫給客戶機(jī),這樣,只要客戶機(jī)的瀏覽器不關(guān),再去訪問服務(wù)器時(shí),都會(huì)帶著session的id號(hào)去,服務(wù)器發(fā)現(xiàn)客戶機(jī)瀏覽器帶sessionid過(guò)來(lái)了,就會(huì)使用內(nèi)存中與之對(duì)應(yīng)的session為之服務(wù)??梢杂萌缦碌拇a證明:1packagexdp.gacl.session;23importjava.io.IOException;4importjavax.servlet.ServletException;5importjavax.servlet.http.HttpServlet;6importjavax.servlet.http.HttpServletRequest;7importjavax.servlet.http.HttpServletResponse;8importjavax.servlet.http.HttpSession;910publicclassSessionDemo1extendsHttpServlet{1112publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)13throwsServletException,IOException{1415response.setCharacterEncoding("UTF=8");16response.setContentType("text/html;charset=UTF-8");17//使用request對(duì)象的getSession()獲取session,如果session不存在則創(chuàng)建一個(gè)18HttpSessionsession=request.getSession();19//將數(shù)據(jù)存儲(chǔ)到session中20session.setAttribute("data","孤傲蒼狼");21//獲取session的Id22StringsessionId=session.getId();23//判斷session是不是新創(chuàng)建的24if(session.isNew()){25response.getWriter().print("session創(chuàng)建成功,session的id是:"+sessionId);26}else{27response.getWriter().print("服務(wù)器已經(jīng)存在該session了,session的id是:"+sessionId);28}29}3031publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)32throwsServletException,IOException{33doGet(request,response);34}35}第一次訪問時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)新的sesion,并且把session的Id以cookie的形式發(fā)送給客戶端瀏覽器,如下圖所示:點(diǎn)擊刷新按鈕,再次請(qǐng)求服務(wù)器,此時(shí)就可以看到瀏覽器再請(qǐng)求服務(wù)器時(shí),會(huì)把存儲(chǔ)到cookie中的session的Id一起傳遞到服務(wù)器端了,如下圖所示:我猜想request.getSession()方法內(nèi)部新創(chuàng)建了Session之后一定是做了如下的處理1//獲取session的Id2StringsessionId=session.getId();3//將session的Id存儲(chǔ)到名字為JSESSIONID的cookie中4Cookiecookie=newCookie("JSESSIONID",sessionId);5//設(shè)置cookie的有效路徑6cookie.setPath(request.getContextPath());7response.addCookie(cookie);四、瀏覽器禁用Cookie后的session處理4.1、IE8禁用cookie工具->internet選項(xiàng)->隱私->設(shè)置->將滑軸拉到最頂上(阻止所有cookies)4.2、解決方案:URL重寫response.encodeRedirectURL(java.lang.String
url)用于對(duì)sendRedirect方法后的url地址進(jìn)行重寫。
response.encodeURL(java.lang.String
url)用于對(duì)表單action和超鏈接的url地址進(jìn)行重寫4.3、范例:禁用Cookie后servlet共享Session中的數(shù)據(jù)IndexServlet1packagexdp.gacl.session;23importjava.io.IOException;4importjava.io.PrintWriter;5importjava.util.LinkedHashMap;6importjava.util.Map;7importjava.util.Set;8importjavax.servlet.ServletException;9importjavax.servlet.http.HttpServlet;10importjavax.servlet.http.HttpServletRequest;11importjavax.servlet.http.HttpServletResponse;1213//首頁(yè):列出所有書14publicclassIndexServletextendsHttpServlet{1516publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)17throwsServletException,IOException{1819response.setContentType("text/html;charset=UTF-8");20PrintWriterout=response.getWriter();21//創(chuàng)建Session22request.getSession();23out.write("本網(wǎng)站有如下書:<br/>");24Set<Map.Entry<String,Book>>set=DB.getAll().entrySet();25for(Map.Entry<String,Book>me:set){26Bookbook=me.getValue();27Stringurl=request.getContextPath()+"/servlet/BuyServlet?id="+book.getId();28//response.encodeURL(java.lang.String
url)用于對(duì)表單action和超鏈接的url地址進(jìn)行重寫29url=response.encodeURL(url);//將超鏈接的url地址進(jìn)行重寫30out.println(book.getName()+"<ahref='"+url+"'>購(gòu)買</a><br/>");31}32}3334publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)35throwsServletException,IOException{36doGet(request,response);37}38}394041/**42*@authorgacl43*模擬數(shù)據(jù)庫(kù)44*/45classDB{46privatestaticMap<String,Book>map=newLinkedHashMap<String,Book>();47static{48map.put("1",newBook("1","javaweb開發(fā)"));49map.put("2",newBook("2","spring開發(fā)"));50map.put("3",newBook("3","hibernate開發(fā)"));51map.put("4",newBook("4","struts開發(fā)"));52map.put("5",newBook("5","ajax開發(fā)"));53}5455publicstaticMap<String,Book>getAll(){56returnmap;57}58}5960classBook{6162privateStringid;63privateStringname;6465publicBook(){66super();67}68publicBook(Stringid,Stringname){69super();70this.id=id;71=name;72}73publicStringgetId(){74returnid;75}76publicvoidsetId(Stringid){77this.id=id;78}79publicStringgetName(){80returnname;81}82publicvoidsetName(Stringname){83=name;84}85}BuyServlet1packagexdp.gacl.session;23importjava.io.IOException;4importjava.util.ArrayList;5importjava.util.List;6importjavax.servlet.ServletException;7importjavax.servlet.http.HttpServlet;8importjavax.servlet.http.HttpServletRequest;9importjavax.servlet.http.HttpServletResponse;10importjavax.servlet.http.HttpSession;1112publicclassBuyServletextendsHttpServlet{1314publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)15throwsServletException,IOException{16Stringid=request.getParameter("id");17Bookbook=DB.getAll().get(id);//得到用戶想買的書18HttpSessionsession=request.getSession();19List<Book>list=(List)session.getAttribute("list");//得到用戶用于保存所有書的容器20if(list==null){21list=newArrayList<Book>();22session.setAttribute("list",list);23}24list.add(book);25//response.encodeRedirectURL(java.lang.String
url)用于對(duì)sendRedirect方法后的url地址進(jìn)行重寫26Stringurl=response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCartServlet");27System.out.println(url);28response.sendRedirect(url);29}3031publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)32throwsServletException,IOException{33doGet(request,response);34}3536}ListCartServlet1packagexdp.gacl.session;23importjava.io.IOException;4importjava.io.PrintWriter;5importjava.util.List;6importjavax.servlet.ServletException;7importjavax.servlet.http.HttpServlet;8importjavax.servlet.http.HttpServletRequest;9importjavax.servlet.http.HttpServletResponse;10importjavax.servlet.http.HttpSession;1112publicclassListCartServletextendsHttpServlet{1314publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)15throwsServletException,IOException{16response.setContentType("text/html;charset=UTF-8");17PrintWriterout=response.getWriter();18HttpSessionsession=request.getSession();19List<Book>list=(List)session.getAttribute("list");20if(list==null||list.size()==0){21out.write("對(duì)不起,您還沒有購(gòu)買任何商品!!");22return;23}2425//顯示用戶買過(guò)的商品26out.write("您買過(guò)如下商品:<br>");27for(Bookbook:list){28out.write(book.getName()+"<br/>");29}30}3132publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)33throwsServletException,IOException{34doGet(request,response);35}36}在禁用了cookie的IE8下的運(yùn)行效果如下:通過(guò)查看IndexServlet生成的html代碼可以看到,每一個(gè)超鏈接后面都帶上了session的Id,如下所示1本網(wǎng)站有如下書:<br/>javaweb開發(fā)<ahref='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=1'>購(gòu)買</a><br/>2spring開發(fā)<ahref='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=2'>購(gòu)買</a><br/>3hibernate開發(fā)<ahref='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=3'>購(gòu)買</a><br/>4struts開發(fā)<ahref='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=4'>購(gòu)買</a><br/>5ajax開發(fā)<ahref='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=5'>購(gòu)買</a><br/>所以,當(dāng)瀏覽器禁用了cookie后,就可以用URL重寫這種解決方案解決Session數(shù)據(jù)共享問題。而且response.encodeRedirectURL(java.lang.String
url)和response.encodeURL(java.lang.String
url)是兩個(gè)非常智能的方法,當(dāng)檢測(cè)到瀏覽器沒有禁用cookie時(shí),那么就不進(jìn)行URL重寫了。我們?cè)跊]有禁用cookie的火狐瀏覽器下訪問,效果如下:從演示動(dòng)畫中可以看到,瀏覽器第一次訪問時(shí),服務(wù)器創(chuàng)建Session,然后將Session的Id以Cookie的形式發(fā)送回給瀏覽器,response.encodeURL(java.lang.String
url)方法也將URL進(jìn)行了重寫,當(dāng)點(diǎn)擊刷新按鈕第二次訪問,由于火狐瀏覽器沒有禁用cookie,所以第二次訪問時(shí)帶上了cookie,此時(shí)服務(wù)器就可以知道當(dāng)前的客戶端瀏覽器并沒有禁用cookie,那么就通知response.encodeURL(java.lang.String
url)方法不用將URL進(jìn)行重寫了。五、session對(duì)象的創(chuàng)建和銷毀時(shí)機(jī)5.1、session對(duì)象的創(chuàng)建時(shí)機(jī)在程序中第一次調(diào)用request.getSession()方法時(shí)就會(huì)創(chuàng)建一個(gè)新的Session,可以用isNew()方法來(lái)判斷Session是不是新創(chuàng)建的范例:創(chuàng)建session1//使用request對(duì)象的getSession()獲取session,如果session不存在則創(chuàng)建一個(gè)2HttpSessionsession=request.getSession();3/
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 九年級(jí)上冊(cè)體育與健康耐力跑 雙杠 教案
- 人教A版(2019)高中數(shù)學(xué)選擇性必修第三冊(cè) 6.3 《二項(xiàng)式定理》課時(shí)1 教學(xué)設(shè)計(jì)
- 長(zhǎng)春版八年級(jí)上冊(cè)信息技術(shù) 10.遮罩動(dòng)畫-探照燈文字 教學(xué)設(shè)計(jì)
- 關(guān)于二十四節(jié)氣的實(shí)踐報(bào)告
- 《蛋白質(zhì)結(jié)構(gòu)與功能》課件
- 用于仔豬腸道你抗生素強(qiáng)N倍
- 2023年2孩離婚協(xié)議書范文范本
- 醫(yī)藥中間體活性堿研發(fā)生產(chǎn)一體化項(xiàng)目可行性研究報(bào)告
- 第2章 有理數(shù)及其運(yùn)算過(guò)關(guān)測(cè)試卷-2024-2025學(xué)年七年級(jí)數(shù)學(xué)上冊(cè)《知識(shí)解讀題型專練》(北師大版2024新教材)
- 你比劃我猜題目大全成語(yǔ)
- 醫(yī)療管理流程優(yōu)化與精益化培訓(xùn)課件
- 安徽省合肥四十五中橡樹灣校區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期中物理試卷
- 醫(yī)院臨床新技術(shù)開展
- 經(jīng)外周穿刺中心靜脈導(dǎo)管置管術(shù)(PICC)護(hù)理操作規(guī)范考核評(píng)分標(biāo)準(zhǔn)
- 高中英語(yǔ)人教版選擇性必修一Unit4 Listening to How Bodies Talk課件
- 2019年全國(guó)測(cè)繪生產(chǎn)成本費(fèi)用定額
- 三位數(shù)除以兩位數(shù)-有余數(shù)-豎式運(yùn)算300題
- 木塑臺(tái)階施工方案
- 2023花城版音樂六年級(jí)上冊(cè)教學(xué)計(jì)劃、教學(xué)設(shè)計(jì)及教學(xué)總結(jié)
- 第3章一元一次方程大單元教學(xué)設(shè)計(jì)人教版七年級(jí)數(shù)學(xué)上冊(cè)
- 個(gè)人社保掛靠協(xié)議 社保掛靠協(xié)議書(8篇)
評(píng)論
0/150
提交評(píng)論