`

jsp环境下session的创建

    博客分类:
  • jsp
 
阅读更多

1)-不恰当的request.getSession()

在HttpServlet中,HttpSession对象通常在request.getSession(true)方法调用时才创建。 HttpSession的使用是有代价的,需要占用服务器资源,本着能不浪费就不浪费的原则,我希望系统中的session都在掌握之中,在需要创建时由 我们的代码明确创建。但是最近在开发中发现,新的session对象经常在意料之外出现,究竟是谁在创建session呢?

最常见的地方是错误的使用request.getSession()函数,通常在action中检查是否有某个变量/标记存放在session中。 这个场景中可能出现没有session存在的情况,正常的判断应该是这样:


Java代码

   1. private boolean ifFlagExistInSession(HttpServletRequest request) ...{
   2.     HttpSession session = request.getSession(false);
   3.     if (session != null) ...{
   4.         if (session.getAttribute("flagName") != null) ...{
   5.             return true;
   6.         }
   7.     }
   8.     return false;
   9. }

而下面的写法,则可能会生成一个新的不在我们意图之外的session:

Java代码

   1. private boolean ifFlagExistInSession(HttpServletRequest request) ...{
   2.     HttpSession session = request.getSession();   // a new session created if no session exists
   3.     if (session.getAttribute("flagName") != null) ...{
   4.         return true;
   5.     }
   6.     return false;
   7. }

注意request.getSession() 等同于 request.getSession(true),除非我们确认session一定存在或者sesson不存在时明确有创建session的需要,否则 请尽量使用request.getSession(false)。


(2)-悄悄干活的jsp
jsp文件是session创建的一个源头,这里指的不是在jsp文件中用代码或者标签来操作session,这些都是在控制中的。容易忽视或者说根本就 不会意识到的(比如我,就是写jsp三年后才发现的)是,jsp有自动创建session的机制,在jsp页面中,如果没有明确的给出 <% @page session="false"%>,jsp页面会非常乖巧(如果刚好需要)或者说是偷偷摸摸(如果不需要)的自动在生成的java文件中增加一 句: javax.servlet.http.HttpSession session = request.getSession(true)。

为了验证这个说法,我们做以下测试,先来一个最简单的jsp文件,名字也简单a.jsp,放到resin下。a.jsp的内容如下,注意里面有一 个<%=1%>,后面会详细解释为什么需要这句话:


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

用页面访问一下,然后到resin下webapp目录的WEB-INF/work/_jsp目录下找到_a__jsp.java,打开可以看到
public class _a__jsp extends com.caucho.jsp.JavaPage
有关jsp页面是如何转换为java文件再被编译成class的介绍,请google。看我们关心的public void _jspService()方法:


Java代码
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();  
可以看到第一行,明确的调用了request.getSession(true),session就是再这里被自动创建的,这里也就是JSP中隐含的 session对象的来历。
使用抓包软件,可以看到请求这个jsp页面的http response里面有以下内容:
Set-Cookie: JSESSIONID=abc0zn72YuHtacvaaORBr; path=/
这个是刚才创建的session的jsessionid,被保存到cookie中。

然后继续测试,设置为
<%@ page session="false"%>

打开java文件:

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();  

没有javax.servlet.http.HttpSession session = request.getSession(true);
这行代码了,同时http response 中没有Set-Cookie: JSESSIONID=***的语句了。
ok,这下清晰了。

再来解释一下为什么要在刚才的jsp文件里面增加<%=1%>这行,我们先做测试,将<%=1%>删除,同样测试& lt;%@ page session="true/false"%>两种情况。可以看到

Java代码
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"%>都不自动创建session。考虑删除<%=1%>后的jsp文件内容


Java代码

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

这个是最简单的纯html页面,估计是resin的实现考虑优化了这点。(resin: 都纯html了,还要session干嘛?)

最后再澄清一点,发现网络上很多人持有一个观点: session在第一次访问时创建。这个明显的是被jsp文件自动创建(默认是true哦)session给误导了,其实只有明确的调用 request.getSession()/request.getSession(true)才会生成session。只是大多数人的jsp页面不会明 确加入<%@ page session="false"%>,也不了解这个机制,造成了错误的理解。

分享到:
评论

相关推荐

    JSP 程序设计从入门到精通 PDF 教程

     1.2.1Tomcat下JSP环境的配置 12  1.2.1建立自己的Jsp工作目录 13  1.3 JSP语法介绍 14  1.3.1 JSP页面中的元素 14  1.3.2 JSP语法概要 15  1.3.3关于模板文本(静态HTML) 16  1.4 运行第一个Jsp程序 ...

    JSP网站开发典型模块与实例精讲

    本书的内容分为三部分:第一部分介绍了JSP的运行原理,开发运行环境的搭建及数据库连接和调试等JSP开发必备知识;第二部分介绍了构成网络系统的几个经典模块等。 目录: 第1章 JSP开发前奏  1.1 JSP基于服务器...

    JSP动态网页制作基础培训教程源代码.rar

    13 sample6.jsp 第6章\ch6 访问SampleBean3示例(Session范围) 14 sample7.jsp 第6章\ch6 访问SampleBean3示例(Application范围) 15 SampleBean4.java 第6章 JavaBean应用示例java代码 16 SampleBean4.class ...

    教学、学习必备:jsp教案

    1.1.4 常用应用开发环境介绍 8 1.1.5 JSP技术概述 10 1.1.6 JSP实现原理 12 1.2 TOMCAT服务器的安装与配置 14 第2章 JSP页面 17 2.1JSP页面 17 2.1.1理解服务器端执行 17 2.1.2JSP页面的基本结构 17 2.1.3JSP的运行...

    Session Cookie的HttpOnly和secure属性

    一、属性说明: 1 secure属性 当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP ...项目架构环境:jsp+servlet+applet

    JavaWeb实验报告(1).pdf

    8、熟练掌握怎样在 JSP 页面中使用 session 对象存储和用户有关的数据。 9、进一步熟悉其它 JSP 内置对象的用法。 二.实验环境 装有 Myeclipse 8.5,Tomcat6.0 的计算机一台 三、实验内容与步骤 《一》简单 Java ...

    网页教程《跟姐姐学JSP》

    3. java环境配置 3.1. 安装jdk 3.2. 配置tomcat服务器 1. 开始编写jsp 1.1. 开篇第一个jsp 1.2. B/S结构,请求与响应 2. 让jsp说hello 2.1. 另一个简单jsp 2.2. 中文乱码 2.2.1. 先解决响应中的乱码 2.2.2. ...

    Servlet与JSP核心编程第2版

    2.7 建立开发环境 2.8 测试系统的设置 2.9 实现简化的部署方法 2.10 默认web应用的部署目录:汇总 2.11 web应用:预览 第3章 servlet基础 .3.1 servlet的基本结构 3.2 生成纯文本的servlet 3.3 ...

    JSP动态网站开发基础教程与实验指导(从基础到应用)光盘

    练习2-1 构建JSP环境 308 练习2-2 安装MyEclipse 309 练习2-3 在Eclipse中使用Tomcat服务器 310 第3单元 312 练习3-1 在JSP页面中静态包含文件 312 练习3-2 统计访问页面数量 312 练习3-3 求圆的面积和周长 313 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet配置相关的元素 247 7.4.1 [servlet]元素及其子元素 247 7.4.2 [servlet-mapping]元素及其子元素...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet配置相关的元素 247 7.4.1 [servlet]元素及其子元素 247 7.4.2 [servlet-mapping]元素及其子元素...

    毕业设计-基于JSP的体育用品商城-设计与实现(源码+论文+视频).zip

    本系统充分利用JSP在应用程序的设计和开发上具有灵活和效率高的特点,采用B/S(browser/server)结构详细地讲述管理信息系统创建的各个过程,并对设计目标、系统开发背景、开发和运行环境选择、系统功能分析、系统...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet配置相关的元素 247 7.4.1 [servlet]元素及其子元素 247 7.4.2 [servlet-mapping]元素及其子元素...

    毕业设计-基于JSP的网上书店系统-设计与实现(源码+论文+视频).zip

    本系统充分利用JSP在应用程序的设计和开发上具有灵活和效率高的特点,采用B/S(browser/server)结构详细地讲述管理信息系统创建的各个过程,并对设计目标、系统开发背景、开发和运行环境选择、系统功能分析、系统...

    毕业设计-基于JSP的高校规章制度管理系统-设计与实现(源码+LW+视频).zip

    本系统充分利用JSP在应用程序的设计和开发上具有灵活和效率高的特点,采用B/S(browser/server)结构详细地讲述管理信息系统创建的各个过程,并对设计目标、系统开发背景、开发和运行环境选择、系统功能分析、系统...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet配置相关的元素 247 7.4.1 [servlet]元素及其子元素 247 7.4.2 [servlet-mapping]元素及其子元素...

    JSP技术简介

    JSP 为创建高度动态的 Web 应用提供了一个独特的开发环境。按照 Sun 的说法, JSP 能够适应市场上包括 Apache WebServer 、 IIS4.0 在内的 85% 的服务器产品。即使您对 ASP 一往情深,我们认为,关注 JSP 的发展...

    jsp最详细教程 最容易入门

    JSP 简介...............................................................JSP 运行环境.............................16 1.5 JSP 页面的测试...................................20 1.6 JSP 与Java Servlet 的关系......

    毕业设计-基于JSP的农业推广项目申报与管理系统-设计与实现(源码+LW+视频).zip

    本系统充分利用JSP在应用程序的设计和开发上具有灵活和效率高的特点,采用B/S(browser/server)结构详细地讲述管理信息系统创建的各个过程,并对设计目标、系统开发背景、开发和运行环境选择、系统功能分析、系统...

    第六章 JSP内置对象

    水一篇博客哈哈哈哈哈 如果没有安装apache服务器的先去安装,还有集成开发环境也得装,不然怎么打代码噢。...JSP内置对象包括request、response、session、application、out、pageContext、config、page、except

Global site tag (gtag.js) - Google Analytics