web11-03 session重點(diǎn)講義_第1頁(yè)
web11-03 session重點(diǎn)講義_第2頁(yè)
web11-03 session重點(diǎn)講義_第3頁(yè)
web11-03 session重點(diǎn)講義_第4頁(yè)
web11-03 session重點(diǎn)講義_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、3. SessionCookie技術(shù)可以將用戶的信息保存在各自的瀏覽器中,優(yōu)點(diǎn):很明顯實(shí)現(xiàn)了同一個(gè)用戶不同請(qǐng)求中數(shù)據(jù)共享。缺點(diǎn):黑客可以利用腳本等手段 竊取cookie中的重要數(shù)據(jù),從而泄漏個(gè)人的隱私,存在巨大的安全隱患。session技術(shù) 是將會(huì)話的數(shù)據(jù)保存在服務(wù)器端的技術(shù)。3.1. 什么是session?為了更好的理解session,以網(wǎng)站購(gòu)物為例,通過一張圖來描述session保存用戶 信息的原理。用戶甲和用戶乙都調(diào)用buyServlet將商品添加到購(gòu)物車,調(diào)用payServlet進(jìn)行商品結(jié)算。由于甲和乙購(gòu)買商品類似,這里以甲為主。 當(dāng)用戶甲訪問購(gòu)物網(wǎng)站時(shí),服務(wù)器為甲創(chuàng)建了一個(gè)sessi

2、on對(duì)象(相當(dāng)于購(gòu)物車)。當(dāng)甲將小米手機(jī)添加到購(gòu)物車時(shí),小米手機(jī)的信息便存到了session對(duì)象中,同時(shí),服務(wù)器將session對(duì)象的唯一標(biāo)識(shí)id屬性以Cookie的形式返回給甲的瀏覽器。當(dāng)甲完成購(gòu)物進(jìn)行結(jié)賬時(shí),需要向服務(wù)器結(jié)賬請(qǐng)求,這時(shí),瀏覽器就會(huì)自動(dòng)在請(qǐng)求頭將 唯一標(biāo)識(shí) 回送給服務(wù)器。服務(wù)器根據(jù)唯一標(biāo)識(shí),找到為用戶甲創(chuàng)建的session容器,并將session對(duì)象中存放的手機(jī)信息進(jìn)行結(jié)算。需要注意的是:由于客戶端需要接受、記錄、和回送session的唯一標(biāo)識(shí),因此通常情況下,session是借助cookie技術(shù)來傳遞ID屬性的。3.2. Session的API3.2.1. 獲取Sessio

3、n對(duì)象Session是基于用戶的請(qǐng)求,而把用戶的重要信息在服務(wù)器端針對(duì)這個(gè)用戶(瀏覽器)創(chuàng)建了一個(gè)容器。而這個(gè)Session容器是由web服務(wù)器(tomcat)幫助我們創(chuàng)建的,在程序中我們只能去獲取到這個(gè)容器,然后給容器添加數(shù)據(jù)或者取出數(shù)據(jù),或者刪除數(shù)據(jù),而我們是不能創(chuàng)建這個(gè)容器對(duì)象。在HttpServletRequest對(duì)象中提供了獲取session對(duì)象的方法:使用request對(duì)象就可以獲取到當(dāng)前針對(duì)用戶的請(qǐng)求服務(wù)器內(nèi)部創(chuàng)建的那個(gè)Session容器對(duì)象。HttpSession依然是一個(gè)接口,而這個(gè)接口的實(shí)現(xiàn)類有web服務(wù)器來提供。只要能夠運(yùn)行我們JavaEE項(xiàng)目的web訪問前,它們都會(huì)實(shí)現(xiàn)

4、Java提供的所有web技術(shù)中的接口。演示Session:需要2個(gè)Servlet程序:在第一個(gè)Servlet中獲取到Session對(duì)象,然后把用戶當(dāng)前的ip保存在Session中,在第二Servlet中取出,然后通過response對(duì)象把ip給客戶端響應(yīng)回去。第一個(gè)Servlet訪問完之后,不使用轉(zhuǎn)發(fā)技術(shù)。給Session對(duì)象中保存數(shù)據(jù):需要使用HttpSession接口中的:獲取數(shù)據(jù):刪除Session中的數(shù)據(jù)需求1: 共享數(shù)據(jù):第一個(gè)Servlet程序:獲取到用戶的ip保存在Session中;在第二個(gè)servlet中取出session中的ip(debug演示)1、新建包:cn.itcast

5、.x_session2、編寫 Session1Servlet,將ip地址保存到session中。public class Session1Servlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException / 需求1: 在session中保存ip地址/ 獲得sessionHttpSession session = request.getSession();/ 獲得ip地址String

6、 ip = request.getRemoteAddr();/ 保存ipsession.setAttribute("ip", ip);/ 給瀏覽器輸出一句話response.setContentType("text/html;charset=utf-8");response.getWriter().println("保存ip成功!");public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,

7、 IOException 3、新建Session2Servlet,從session中獲取ippublic class Session2Servlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException / 需求2: 從session中取出ip/ 獲取sessionHttpSession session = request.getSession();/ 獲取ipString ip =

8、(String) session.getAttribute("ip");response.setContentType("text/html;charset=utf-8");response.getWriter().println("您的ip地址是:" + ip);public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 4、通過瀏覽器直接訪問Session2Serv

9、let,能夠看到ip嗎?看不到,原因:還沒有向session容器中存放ip。5、通過瀏覽器先訪問Session1Servlet,再訪問Session2Servlet,能看到ip地址嗎? 能3.2.2. 服務(wù)器端操作Session時(shí)細(xì)節(jié)其實(shí)服務(wù)器端可以識(shí)別每個(gè)用戶的對(duì)應(yīng)的Session容器,主要是因?yàn)榉?wù)器針對(duì)每個(gè)用戶都發(fā)送了JSESSIONID(session容器的唯一標(biāo)識(shí))的Cookie信息。這樣用戶在操作的時(shí)候,都會(huì)攜帶這個(gè)Cookie到服務(wù)器端,因此服務(wù)器端才能識(shí)別針對(duì)當(dāng)前這個(gè)用戶的那個(gè)session容器對(duì)象。服務(wù)器在給客戶端響應(yīng)數(shù)據(jù)的時(shí)候,把Session容器的唯一標(biāo)識(shí)以Cookie的

10、形式發(fā)送給瀏覽器,而這個(gè)Cookie是一個(gè)會(huì)話級(jí)別(臨時(shí))Cookie,它只能存活在瀏覽器運(yùn)行的階段,如果瀏覽器關(guān)閉了,這個(gè)Cookie信息就沒有了,因此在此打開瀏覽器訪問的時(shí)候,就不會(huì)在服務(wù)器獲取到針對(duì)當(dāng)前用戶的JSESSIONID信息,因此無法找到針對(duì)當(dāng)前用戶的那個(gè)Session容器。進(jìn)一步說明,服務(wù)器端的Session容器對(duì)象,是針對(duì)每個(gè)瀏覽器的。3.2.3. 使用getSession方法的細(xì)節(jié)在api中提供2個(gè)獲取Session對(duì)象的方法:getSession():空參數(shù)的方法,在使用的時(shí)候,如果服務(wù)器端針對(duì)當(dāng)前用戶的瀏覽器沒有Session容器,這時(shí)在服務(wù)器的內(nèi)部會(huì)先創(chuàng)建一個(gè)Sess

11、ion對(duì)象,然后把這個(gè)Session對(duì)象返回給我們的程序。如果Session容易已經(jīng)存在,這時(shí)它是不會(huì)再創(chuàng)建新的Session容器對(duì)象,只是把找到的這個(gè)Session容器對(duì)象返回給程序。在找的過程中需要依賴于JSESSIONID。getSession(Boolean create):如果這個(gè)在調(diào)用的時(shí)候,傳遞的值為false,它僅僅只會(huì)在容器根據(jù)JSESSIONID找有沒有對(duì)應(yīng)的Session容器對(duì)象,如果有就返回這個(gè)Session容器對(duì)象,如果沒有,就返回null。如果傳遞的值true,在根據(jù)JSESSIONID找Session容器對(duì)象的時(shí)候,如果不存在就會(huì)創(chuàng)建一個(gè)新的Session容器對(duì)象

12、,并返回這個(gè)容器對(duì)象,如果存在就,直接返回存在的Session容器對(duì)象。3.3. 思考:關(guān)閉瀏覽器后再次訪問能獲取到Session的數(shù)據(jù)嗎?一般情況下,關(guān)閉瀏覽器之后,再次訪問,是無法獲取到Session中的數(shù)據(jù)的。因此在服務(wù)器針對(duì)當(dāng)前用戶的第一次請(qǐng)求創(chuàng)建的唯一的Session容器對(duì)象,而在給這次請(qǐng)求的之后,服務(wù)器需要給用戶響應(yīng)數(shù)據(jù),在響應(yīng)的時(shí)候,服務(wù)器把當(dāng)前Session容器對(duì)象的JSESSIONID以Cookie的形式發(fā)送給了瀏覽器。而這個(gè)Cookie并沒有設(shè)置有效時(shí)間,那么這個(gè)Cookie就屬于臨時(shí)Cookie,在關(guān)閉瀏覽器之后,再次打開瀏覽器的時(shí)候,上次的Cookie已經(jīng)消失了,用戶雖

13、然拿同一個(gè)瀏覽器訪問服務(wù)器,可是這時(shí)沒有JSESSIONID,服務(wù)器端的Session容器依然存在,但是沒有JSESSIONID,服務(wù)器內(nèi)部無法獲取到這個(gè)session對(duì)象把包含了JSESSIONID的Cookie在客戶端持久化。需求2:手動(dòng)的將 session對(duì)應(yīng)的cookie持久化,關(guān)閉瀏覽器再次訪問session中的數(shù)據(jù)依然存在3.4. 禁用Cookie后Session追蹤服務(wù)器端獲取Session對(duì)象依賴于客戶端攜帶的Cookie中的JSESSIONID數(shù)據(jù)。如果用戶把瀏覽器的隱私級(jí)別調(diào)到最高,這時(shí)瀏覽器是不會(huì)接受Cookie、這樣導(dǎo)致永遠(yuǎn)在服務(wù)器端都拿不到的JSESSIONID信息。

14、這樣就導(dǎo)致服務(wù)器端的Session使用不了。Java針對(duì)Cookie禁用,給出了解決方案,依然可以保證JSESSIONID的傳輸。Java中給出了再所有的路徑的后面拼接JSESSIONID信息。使用response對(duì)象中的方法完成:需求3:瀏覽器禁用cookie,當(dāng)前servlet的session中設(shè)置ip,超鏈接跳轉(zhuǎn)另一個(gè)servlet時(shí)可以獲取ip地址。1 在 Session1Servlet中,使用response.encodeURL(url) 對(duì)超鏈接路徑拼接 session的唯一標(biāo)識(shí) 2 使用瀏覽器訪問在response對(duì)象中的提供的encodeURL方法它只能對(duì)頁(yè)面上的超鏈接或者是f

15、orm表單中的action中的路徑進(jìn)行重寫(拼接JSESSIONID)。如果我們使用的重定向技術(shù),這時(shí)必須使用下面方法完成:需求4:瀏覽器禁用cookie,當(dāng)前servlet的session中設(shè)置ip,重定向跳轉(zhuǎn)另一個(gè)servlet時(shí)可以獲取ip地址。1 在Session1Servlet 的基礎(chǔ)上增加如下代碼:其實(shí)就是在路徑后面拼接了 Session的唯一標(biāo)識(shí) JSESSIONID。3.5. Session的生命周期(面試)Session對(duì)象的創(chuàng)建時(shí)間:當(dāng)前服務(wù)器啟動(dòng)之后,用戶第一次訪問某個(gè)Servlet程序的時(shí)候,在這個(gè)Servlet中調(diào)用getSession()方法或者調(diào)用的getSess

16、ion(true),這時(shí)服務(wù)器內(nèi)部才會(huì)針對(duì)當(dāng)前這個(gè)用戶的瀏覽器創(chuàng)建一個(gè)Session容器對(duì)象。Session的銷毀時(shí)間:1、 不正常關(guān)閉服務(wù)器。如果是正常關(guān)閉服務(wù)器,這時(shí)服務(wù)器內(nèi)部會(huì)使用IO流中的序列化技術(shù)把這個(gè)Session對(duì)象保存在tomcat/work目錄下面。2、 Session在服務(wù)器的存活時(shí)間。Session對(duì)象在服務(wù)器內(nèi)部有默認(rèn)的存活的時(shí)間。一般默認(rèn)是30分鐘。如果在30分鐘內(nèi),用戶沒有再對(duì)當(dāng)前這個(gè)服務(wù)器中的資源進(jìn)行任何的訪問操作,這時(shí)只要時(shí)間到達(dá)30分鐘,服務(wù)器會(huì)自動(dòng)的銷毀這個(gè)session。Session的存活時(shí)間我們可以在當(dāng)前這個(gè)項(xiàng)目的web.xml中配置:3、調(diào)用Http

17、Session中的銷毀Session的方法:3.6. Session案例一次性驗(yàn)證碼登錄驗(yàn)證碼的實(shí)現(xiàn)原理:在一個(gè)Servlet中生成驗(yàn)證,并把驗(yàn)證碼上的數(shù)據(jù)保存在Session,用戶提交驗(yàn)證碼之后,會(huì)提交給另外一個(gè)Servlet程序。在獲取用戶提交數(shù)據(jù)的Servlet中的從Session中把驗(yàn)證碼取出,在取出的同時(shí)從Session中把驗(yàn)證碼刪除。注冊(cè)頁(yè)面:register.jsp <script type="text/javascript"> function _changImg() document.getElementById("myimg&quo

18、t;).src = "/day11/checkImg?" + new Date().getMilliseconds(); </script> </head> <body> <center> <form action="/day11/regist" method="post"><table><tr><td>用戶名<font color="red">*</font></td><td&

19、gt;<input type="text" name="name"/></td></tr><tr><td>密碼</td><td><input type="password" name="password"/></td></tr><tr><td>輸入驗(yàn)證碼</td><td><input type="text" name=&qu

20、ot;form_checkcode" /><img style="cursor: pointer;" alt="" src="/day11/checkImg" id="myimg" onclick="_changImg();"/> <a href="javascript:void(0);" onclick="_changImg();">看不清,換一張</a> <font color="re

21、d">$imgError </font></td></tr><tr> <td><input type="submit" value="注冊(cè)" /></td> </tr></table> </form> </center> </body>生成驗(yàn)證碼參考:cn.itcast.session.CheckImgServletpublic class CheckImgServlet extends Http

22、Servlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException int width = 120;int height = 40;/ 先生成一張紙BufferedImage bufi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);/ 畫筆Graphics g = bufi.getGraphics();/ 設(shè)置背景顏色/ 修改畫筆顏色g.set

23、Color(Color.white);/ 填充g.fillRect(0, 0, width, height);/ 繪制邊框/ 設(shè)置邊框顏色g.setColor(Color.red);/ 畫邊框g.drawRect(0, 0, width - 1, height - 1);/ 準(zhǔn)備一些數(shù)據(jù)String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz"/ 生成隨機(jī)對(duì)象Random r = new Random();String checkcode = ""/ 生成4

24、個(gè)隨機(jī)的數(shù)字for (int i = 0; i < 4; i+) / 生成隨機(jī)顏色g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255);/ 設(shè)置字體g.setFont(new Font("宋體", Font.ITALIC, 25);String c = data.charAt(r.nextInt(data.length() + ""g.drawString(c, 10 + (20 * i), 30);checkcode += c;/ 將生成的驗(yàn)證碼放到 session

25、中request.getSession().setAttribute("session_checkcode", checkcode);/ 畫干擾線for (int i = 0; i < 8; i+) / 設(shè)置隨機(jī)顏色g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255);/ 畫線 兩點(diǎn)確定一線g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height);/ 將圖片輸出到瀏覽器Image

26、IO.write(bufi, "jpg", response.getOutputStream();public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException public class RegistServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException / 獲得表單里的驗(yàn)證碼String form_chec

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論