小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

tomcat中cookie的設(shè)置與jsp中session的設(shè)置

 燮羽 2010-11-06

大家都知道,在開發(fā)一個互聯(lián)網(wǎng)應(yīng)用的時候,為了達(dá)到一種服務(wù)端和客戶端有狀態(tài)的效果,需要有一個sessionid     來對客戶端進(jìn)行標(biāo)志。很多時候,這是通過在客戶端防止session cookie實現(xiàn)的。但是如果客戶端禁用了cookie呢?這就需要通過urlrewrite或者其他方式來實現(xiàn)。于是我們可能就在應(yīng)用里面不需要cookie了。既然不需要了當(dāng)然是希望我們的應(yīng)用不對cookie進(jìn)行處理。很遺憾的是,tomcat默認(rèn)的是處理cookie的。每次請求過來的時候,都會解析request head里面的cookie信息,試圖從中發(fā)現(xiàn)sessionid的信息。于是我們就需要從應(yīng)用服務(wù)器層面把這個"無用功"去掉。

tomcat(我讀的是tomcat6的源碼)可以通過設(shè)置來實現(xiàn):

在conf/context.xml里面:<Context cookies = "false">。那么就禁用了cookie了。

在源碼級別的實現(xiàn)則是在CoyoteAdapter里面:

Java代碼 
  1. protected void parseSessionCookiesId(org.apache.coyote.Request req, Request request) {  
  2.   
  3.        // If session tracking via cookies has been disabled for the current  
  4.        // context, don't go looking for a session ID in a cookie as a cookie  
  5.        // from a parent context with a session ID may be present which would  
  6.        // overwrite the valid session ID encoded in the URL  
  7.        Context context = (Context) request.getMappingData().context;  
  8.        if (context != null && !context.getCookies())  
  9.            return;   

  在這里面做了一個判斷,如果context禁用了cookie,那么就不做解析。如果使用cookie,那么試著從cookie里面解析

  sessionid,并且如果存在的話覆蓋request里面已有的(從url里面解析出來的)或者還沒有的sesssionid.

 這個方法的入口是在CoyoteAdapter的service方法里面,這個方法沿著tomcat6的component 鏈傳遞處理request 和response,結(jié)構(gòu)圖如下:

               service--------->EngineValue

                                            |

                                        HostValue

                                            |

                                        ContextValue

                                            |

                                         WrapperValue

這實際就是一個chain of resposibility模式,負(fù)責(zé)對request和response進(jìn)行各自職責(zé)范圍內(nèi)的包裝和處理。

最后的WrapperValue執(zhí)行調(diào)用servlet處理請求的步驟。

 

好了,上面簡單解釋了cookie的處理,那么下面就是session了。

 

不管通過什么方式,通過cookie也好,通過urlrewrite也好,session在需要的時候是肯定要產(chǎn)生的.

但是如果我們不需要呢?比如恰好我們要展現(xiàn)給客戶的首頁就是jsp的,客戶不需要登錄就能瀏覽這個頁面的內(nèi)容。

那么這個時候?qū)τ诳蛻舻恼埱髣?chuàng)建session就是沒有必要的了。

 

一種常用的不創(chuàng)建session的方法是在jsp頁面頭上加一句:

<%@ page session=”false”>

這樣在請求這個頁面的時候就不產(chǎn)生session了。

這個在tomcat內(nèi)部是怎么實現(xiàn)的呢?

 

首先明確一點,jsp在本質(zhì)上是httpservlet,在/tomcat/work目錄下面你會發(fā)現(xiàn)有跟自己的應(yīng)用相同目錄結(jié)構(gòu)的一些文件,其中的jsp文件都變成了class文件,這實際是被jspcompiler編譯過的。上面提到了WrapperValue會最終調(diào)用

servlet處理request。有興趣的同學(xué)可以跟蹤一下,會發(fā)現(xiàn)到了調(diào)用jsp對應(yīng)的servlet(JspServlet)(這個是在tomcat/conf/web.xml里面配置的,對于.jsp,對應(yīng)的servlet是jspservlet)時,最終會著落在

tomcat下面實現(xiàn)了PageContext接口的特定于jsp specification的實現(xiàn)類:PageContextImpl。

在這個類的initialize里面有這么一句:

Java代碼 
  1. if (request instanceof HttpServletRequest && needsSession)  
  2.             this.session = ((HttpServletRequest) request).getSession();  

 這句的意思就是,有session獲取session,沒session新建一個。而通常,這個地方也是客戶端與tomcat下面的應(yīng)用交互時產(chǎn)生session的入口。

這句里面的needsSession就是之前提到的jsp頁面上配置的值,默認(rèn)是true.所以如果想在訪問某個頁面時不產(chǎn)生session,只需要設(shè)置成false就可以了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多