WEB应用Session自动创建的问题 2008-04-19 Web
WEB应用(JSP/Servlet,ASP,PHP等)的Session会占用服务器的资源,影响系统的性能和伸缩性,所以要尽量少地使用Session,同时在Session中存储尽量少的数据。而Session在一些情况下会在不知情的情况下自动创建,势必会造成服务器资源的浪费。
首先: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”/>






