對tomcat的jsp進行壓力測試不斷耗盡內存的緣由

先request.getsession(),當已有一個session與前request相關時就返回對這個session的引用,當沒有時就生成一個.一個session在server經過一個sessionid來標識的。也就是說在一個server是不會有兩個相同sessionid的session. web


那麼session爲何會和cookie扯在一塊兒呢? api


正如我所說對於一個session來講它的sessionid就是其身份的標識。若咱們將這個sessionid保存到用戶端,當同一個會話的後序請求來時都將這個sessionid放在request 的header中(也就是咱們說的cookie)這樣不就能夠來驗證這個request是否與以前的request是同一個會話了嗎! 瀏覽器


什麼是會話呢? 安全

咱們能夠通俗一點理解。只要你的browers不關咱們就稱這一系列的request與response爲一個會話。一斷你close就稱這個會話已結束。雖然會話結束但並不表明你的session就被destroy.由於session是存活在server上的。它的生命徹底由server來主宰(web.xml中的設定). 服務器

雖然你的session還存活在server上但你已沒法再取得它。由於j2ee的api只給咱們一種方法來取得與當前會話相關的session的引用:request.getsession() or reqeust.getsession(boolean) cookie



這也就是爲會什麼會有"當瀏覽器關session就結束"這個錯誤的說法了! session

session的建立和銷燬由服務器端控制",服務器端纔有session,客戶端只是經過sessionid來匹配session. jsp

那服務器端session如何建的呢? 普通htm不會建立,jsp默認是建立的,只要你訪問一個任何一個jsp就會建立(不過只建立一次),你關閉瀏覽器重新訪問又會建立一個,這些建立的session由服務器本身控制銷燬,你也能夠在服務器端代碼中銷燬。 測試

什麼狀況下須要用上這種服務器端的session方式? server

默認狀況下,jsp被訪問就會建立session(最開始是空的沒有數據的),你的應用中的代碼只是往session裏面put數據。網上說能夠 經過 <%@ page session="false"%>來不讓jsp自動創session.我本身測試了一下(用sessionlistener),根本不起做用,session照樣建立成功。

最後說一下,只有服務器端纔有session.客戶端被存到本地的是cookie.不過安全性低。因此不能放重要的數據。


深入理解一下,  

一個常見的誤解是覺得session在有客戶端訪問時就被建立,然而事實是直到某server端程序調用HttpServletRequest.getSession(true)這樣的語句時才被建立,

注意若是JSP沒有顯示的使用 <%@page session="false"%> 關閉session,

則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);


這也是JSP中隱含的session對象的來歷。


訪問任何一個JSP的時候,默認會自動建立Session的,能夠在全部JSP的頭部增長指令:

<%@ page session=」false」%>
若是將以上指令寫入JSP中,那麼該JSP就不能使用Session了,通常狀況下沒有問題。
若是在JSP中想使用Session,怎麼辦呢?
1)只禁用入口JSP(登陸JSP)的Session
2)將全部JSP放置到WEB-INF目錄下面,避免用戶直接訪問JSP文件
這樣就保證只有用戶登陸成功以後才建立新的Session,避免建立不少沒有的Session,佔用服務器的資源。

注:假如JSP沒有禁用Session,同時JSP可以被正常訪問,那麼攻擊者就能夠啓動多個瀏覽器進程屢次訪問JSP,服務器會自動建立不少垃圾Session,影響正經常使用戶的訪問。
注:當jsp中包括相似於 <img src=」imgs/logo.gif」> 這樣的代碼,若是logo.gif文件不存在,那麼每次訪問該jsp就會自動新建一個session,會致使session愈來愈多。

其次:Struts中Session自動建立的問題
Struts中從頁面提交表單到action類,再跳轉到下一個頁面的時候,Session都會自動建立。
建立Session就是經過使用語句request.getSession()或request.getSession(true)來實現的。
通過研究Struts的源代碼,發現Struts在處理自動Locale時致使的,其中調用了request.getSession()方法,
因此若是Session不存在時就自動建立了一個新的Session,能夠關閉自動Locale的功能:
在struts-config.xml的controller配置中增長一個locale參數值等於false便可:
<controller locale=」false」/>
相關文章
相關標籤/搜索