对tomcat的jsp进行压力测试不断耗尽内存的原因

先request.getsession(),当已有一个session与前request相关时就返回对这个session的引用,当没有时就生成一个.一个session在server通过一个sessionid来标识的。也就是说在一个server是不会有两个相同sessionid的session.


那么session为什么会和cookie扯在一起呢?


正如我所说对于一个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)



这也就是为会什么会有"当浏览器关session就结束"这个错误的说法了!

session的创建和销毁由服务器端控制",服务器端才有session,客户端只是通过sessionid来匹配session.

那服务器端session如何建的呢? 普通htm不会创建,jsp默认是创建的,只要你访问一个任何一个jsp就会创建(不过只创建一次),你关闭浏览器从新访问又会创建一个,这些创建的session由服务器自己控制销毁,你也可以在服务器端代码中销毁。

什么情况下需要用上这种服务器端的session方式?

默认情况下,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”/>

你可能感兴趣的:(对tomcat的jsp进行压力测试不断耗尽内存的原因)