Sky's blog

          我和我追逐的夢(mèng)

          常用鏈接

          統(tǒng)計(jì)

          其他鏈接

          友情鏈接

          最新評(píng)論

          誰(shuí)在創(chuàng)建session(2)-悄悄干活的jsp

          jsp文件是session創(chuàng)建的一個(gè)源頭,這里指的不是在jsp文件中用代碼或者標(biāo)簽來(lái)操作session,這些都是在控制中的。容易忽視或者說(shuō)根本就不會(huì)意識(shí)到的(比如我,就是寫(xiě)jsp三年后才發(fā)現(xiàn)的)是,jsp有自動(dòng)創(chuàng)建session的機(jī)制,在jsp頁(yè)面中,如果沒(méi)有明確的給出 <%  @page session="false"%>,jsp頁(yè)面會(huì)非常乖巧(如果剛好需要)或者說(shuō)是偷偷摸摸(如果不需要)的自動(dòng)在生成的java文件中增加一句: javax.servlet.http.HttpSession session = request.getSession(true)。

          為了驗(yàn)證這個(gè)說(shuō)法,我們做以下測(cè)試,先來(lái)一個(gè)最簡(jiǎn)單的jsp文件,名字也簡(jiǎn)單a.jsp,放到resin下。a.jsp的內(nèi)容如下,注意里面有一個(gè)<%=1%>,后面會(huì)詳細(xì)解釋為什么需要這句話:

          <%@ page session="true"%>
          <html>
          <head>
          <title>test</title>
          </head>
          <body>
          <%=1%>
          </body>
          </html>

          用頁(yè)面訪問(wèn)一下,然后到resin下webapp目錄的WEB-INF/work/_jsp目錄下找到_a__jsp.java,打開(kāi)可以看到
          public class _a__jsp extends com.caucho.jsp.JavaPage
          有關(guān)jsp頁(yè)面是如何轉(zhuǎn)換為java文件再被編譯成class的介紹,請(qǐng)google。看我們關(guān)心的public void  _jspService()方法:

          public void  _jspService(javax.servlet.http.HttpServletRequest request,
                        javax.servlet.http.HttpServletResponse response)
              throws java.io.IOException, javax.servlet.ServletException
            {
              javax.servlet.http.HttpSession session = request.getSession(true);
              com.caucho.server.webapp.Application _jsp_application = _caucho_getApplication();

          可以看到第一行,明確的調(diào)用了request.getSession(true),session就是再這里被自動(dòng)創(chuàng)建的,這里也就是JSP中隱含的session對(duì)象的來(lái)歷。
          使用抓包軟件,可以看到請(qǐng)求這個(gè)jsp頁(yè)面的http response里面有以下內(nèi)容:
          Set-Cookie: JSESSIONID=abc0zn72YuHtacvaaORBr; path=/
          這個(gè)是剛才創(chuàng)建的session的jsessionid,被保存到cookie中。

          然后繼續(xù)測(cè)試,設(shè)置為
          <%@ page session="false"%>

          打開(kāi)java文件:
          public void _jspService(javax.servlet.http.HttpServletRequest request,
                        javax.servlet.http.HttpServletResponse response)
              throws java.io.IOException, javax.servlet.ServletException
            {
              com.caucho.server.webapp.Application _jsp_application = _caucho_getApplication();

          沒(méi)有javax.servlet.http.HttpSession session = request.getSession(true);
          這行代碼了,同時(shí)http response 中沒(méi)有Set-Cookie: JSESSIONID=***的語(yǔ)句了。
          ok,這下清晰了。

          再來(lái)解釋一下為什么要在剛才的jsp文件里面增加<%=1%>這行,我們先做測(cè)試,將<%=1%>刪除,同樣測(cè)試<%@ page session="true/false"%>兩種情況。可以看到
          public void _jspService(javax.servlet.http.HttpServletRequest request,
                        javax.servlet.http.HttpServletResponse response)
              throws java.io.IOException, javax.servlet.ServletException
            {
              javax.servlet.http.HttpSession session = request.getSession(true);


          則不管是否有<%@ page session="true"%>都不自動(dòng)創(chuàng)建session。考慮刪除<%=1%>后的jsp文件內(nèi)容

          <%@ page session="true"%>
          <html>
          <head>
          <title>test</title>
          </head>
          <body>
          </body>
          </html>
          這個(gè)是最簡(jiǎn)單的純html頁(yè)面,估計(jì)是resin的實(shí)現(xiàn)考慮優(yōu)化了這點(diǎn)。(resin: 都純html了,還要session干嘛?)

          最后再澄清一點(diǎn),發(fā)現(xiàn)網(wǎng)絡(luò)上很多人持有一個(gè)觀點(diǎn): session在第一次訪問(wèn)時(shí)創(chuàng)建。這個(gè)明顯的是被jsp文件自動(dòng)創(chuàng)建(默認(rèn)是true哦)session給誤導(dǎo)了,其實(shí)只有明確的調(diào)用request.getSession()/request.getSession(true)才會(huì)生成session。只是大多數(shù)人的jsp頁(yè)面不會(huì)明確加入<%@ page session="false"%>,也不了解這個(gè)機(jī)制,造成了錯(cuò)誤的理解。

          posted on 2007-12-19 12:26 sky ao 閱讀(3808) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): web

          評(píng)論

          # re: 誰(shuí)在創(chuàng)建session(2)-悄悄干活的jsp[未登錄](méi) 2007-12-19 18:24 GoKu

          看看COOKIE里面的JSESSIONID就知道了  回復(fù)  更多評(píng)論   

          # re: 誰(shuí)在創(chuàng)建session(2)-悄悄干活的jsp 2007-12-24 11:00 yoseasoft

          精辟的解釋  回復(fù)  更多評(píng)論   

          # re: 誰(shuí)在創(chuàng)建session(2)-悄悄干活的jsp[未登錄](méi) 2008-01-19 04:12 Eric

          我覺(jué)得你被Resin搞混了,Resin對(duì)於<%@ page session="true|false"%>所產(chǎn)生的java code不符合JSP的Spec
          請(qǐng)參考一下官方文件對(duì)此參數(shù)的說(shuō)明
          http://java.sun.com/products/jsp/syntax/1.1/syntaxref118.html#15653

          實(shí)際上那段code 應(yīng)該是
          1. <%@ page session="true"%>
          javax.servlet.http.HttpSession session = pageContext.getSession();
          2. <%@ page session="false"%>
          不會(huì)產(chǎn)生上面那段Code, 也就是說(shuō)你無(wú)法在該JSP的程式碼中直接取用implicit object- session
            回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 丰宁| 塘沽区| 阿城市| 镇雄县| 霞浦县| 若羌县| 高安市| 黑山县| 鹤山市| 陕西省| 凤山市| 清徐县| 武乡县| 怀宁县| 衡东县| 神木县| 盈江县| 元阳县| 西和县| 长阳| 南华县| 庆云县| 潍坊市| 禹州市| 壶关县| 瓮安县| 钟山县| 沁水县| 商南县| 铜陵市| 宜川县| 温州市| 泰州市| 三都| 青州市| 长顺县| 隆子县| 阿拉善右旗| 灵台县| 灵璧县| 宁乡县|