`
yinchunjian
  • 浏览: 278967 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Session对象创建和控制

    博客分类:
  • java
阅读更多

 首先谈一下对session对象在web开发中的创建以及sessionId生成并返回客户端的运行机制.

  session对象当客 户端首次访问时,创建一个新的session对象.并同时生成一个sessionId,并在此次响应中将sessionId以响应报文的方式些回客户端浏 览器内存或以重写url方式送回客户端,来保持整个会话,只要sever端的这个session对象没有销毁,以后再调用 request.getSession()时就直接根据客户端的sessionId来检索server端生成的session对象并返回,不会再次去新 建,除非根据此sessionId没有检索到session对象.

  下面是在IE下测试,因为IE6.0的一个BUG就是IE的隐私设置即使是阻止所有cookie时,也还是会以会话cookie来保存sessionId.所以下面都是以会话cookie来讨论的,

  (1)在server没有关闭,并在session对象销毁时间内, 当客户端再次来请求server端的servlet或jsp时,将会将在第一次请求时生成的sessionId并附带在请求信息头中并向server端发 送,server端收到sessionId后根据此sessionId会去搜索(此过程是透明的)server对应的session对象并直接返回这个 session对象,此时不会重新去建立一个新的session对象.

  (2)当server关闭(之 前产生的session对象也就消亡了),或session对象过了其销毁时间后,浏览器窗口不关,并在本浏览器窗口再次去请求sever端的 servlet和jsp时,此时同样会将sessionId(server关闭或session销毁时生成的sessionId)发送到server端, server根据sessionId去找其对应的session对象,但此时session对象已经不存在,此时会重新生成一个新的session对象, 并生成新的sessionId并同样将这个新生成的sessionId以响应报文的形式送到浏览器内存中.

  (3)当server没有关闭,并session对象在其销毁时间内,当请求一个jsp页面回客户端后,关闭此浏览器窗口,此时其内存中的 sessionId也就随之销毁,在重新去请求sever端的servlet或jsp时,会重新生成一个sessionId给客户端浏览器,并存在浏览内 存中.

  上面的理论在servlet中测试都是成立的,下面谈一下在struts框架下进行上面的测试时的不同的地方.

  先简要说下测试程序的流程:

  客户端请求index.do--->进入server端的IndexAction--->转向login.jsp页面----->请求login.do----->进入server端的LoginAction.

  首先说明:IndexAction中没有去产生session对象,login.jsp中设置.

  (1)环境servlet + jsp:

  在sevlet +jsp测试跟踪时,在index.do进入IndexAction后转向login.jsp时,此时浏览器内存中是没有会话cookie的,那么在 login.jsp上请求login.do进入LoginAction后,用request.getCookies()测试时,其值是为null的!结果 是稳合的,因为从始置终没有产生过session.

  (2)环境struts + jsp:

  在struts +jsp测试跟踪时,跟上面的流程一样,开始想结果也应该是一样的,但经过调试后发现结果却不是所想的那样.在login.do进入 LoginActoin后用,用request.getCookies()测试时,发现其值不为null,即其有name和value,开始很不理解,因 为根本就没有创建过session对象,哪来的会话cookie值呢.但是结果有,那么想着此时浏览器内存中也就应该有会话cookie,问题就在这里! 从哪里来的?

  后来经过仔细考虑后,想到struts中的特点,我们自己写的Action类是继承struts的Action的,而且之前 是经过struts的中央控制器ActionServlet来控制转向的,所以我想肯定是在程序进入我自己写的IndexAction之前,struts 框架中的代码肯定已经创建了session对象并已经生成了sessionId.于是就找到相关书籍查看了ActionServlet工作流程以及调用哪 些类,看了之后果然在其中看到了HttpSession session = request.getSession();这样一句话!于是答案也就明白了.

  大家知道struts的ActionServlet类中在接收到我们客户端的请求(*.do)后(之前会做一系列初始化工作),并不是直接去处 理我们的请求 并调用相应的Action(我们写的如IndexAction),而是将处理工作交给RequestProcessor类,其process方法中会调用 一系列的方法来完成相应的请求处理和转向操作.其中有一个方法引起了我的关注,就是processLocale()方法.

  Struts框架:RequestProcess类中的processLocale()方法原型如下:

  protected void processLocale(HttpServletRequest request,
        HttpServletResponse response) {
        // Are we configured to select the Locale automatically?
        if (!moduleConfig.getControllerConfig().getLocale()) {
            return;
        }
        // Has a Locale already been selected?
        HttpSession session = request.getSession();
        if (session.getAttribute(Globals.LOCALE_KEY) != null) {
            return;
        }
   // Use the Locale returned by the servlet container (if any)
        Locale locale = request.getLocale();
        if (locale != null) {
            if (log.isDebugEnabled()) {
                log.debug(" Setting user locale '" + locale + "'");
            }
            session.setAttribute(Globals.LOCALE_KEY, locale);
        }
    }
   此类在struts-config.xml配置文件中有对应的配置项: < controller locale="true">< /controller> 其缺省状态locale属性的值为true,也就会调用processLocale方法,并在第一次请求时创建session对象和生成 sessionId.但改为false后,在第一次请求到达ActionServlet后不会调用processLocale方法,也就不会生成 session对象了.

  结果也就出来了,在struts应用中,*.do到达server端后经过ActionServlet后转想我们 自己写的IndexAction之前, < controller locale="true">< /controller>(缺省状态) 时,就已经产生了session对象和sessionId,这是struts框架类中生成的,即使我们在IndexAction中写上 HttpSession session = request.getSession();其也是RequestProcess类中的processLocale()方法生成的,此时其session 的isNew也还是true,因为还没有返回客户端,其是新创建的,那么按照上面的流程,当在login.jsp上通过login.do进入 LoginAction后,其request.getCookies()固然也就有值了!并且其值是RequestProcess类中的 processLocale()方法产生session对象时生成的.

  如果我们在struts-config.xml中加上< controller locale="false">< /controller> 时,此时如果再根据上面的流程来跟踪程序,并在LoginAction用request.getCookies()测试时,其值是为null的,当然在 IndexAction写上HttpSession session = request.getSession();时其是进入IndexAction时新创建的,isNew也是true.

分享到:
评论
1 楼 tyyh08t1003 2012-08-21  
< controller locale="true">< /controller>

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    毕业设计:ASP上海软件贸易网站设计与实现(源代码)

    ASP提供一些内建对象,包括一些方法,属性。对象的方法用来和对象一起执行一些任务。对象属性用来设置对象指定状态的值。...存储在Session对象之中的变量对于用户是可以得到的,即使用户在应用程序之中正在浏览页面

    Django 5种类型Session使用方法解析

    当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。 session...

    精通Hibernate:对象持久化技术第二版part3

    5.1.5 控制insert和update语句 108 5.2 处理SQL引用标识符 109 5.3 创建命名策略 110 5.4 设置数据库Schema 112 5.5 设置类的包名 113 5.6 运行本章的范例程序 114 5.7 小结 120 5.8 思考题 121 第6章 映射...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    5.1.5 控制insert和update语句 108 5.2 处理SQL引用标识符 109 5.3 创建命名策略 110 5.4 设置数据库Schema 112 5.5 设置类的包名 113 5.6 运行本章的范例程序 114 5.7 小结 120 5.8 思考题 121 第6章 映射...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    Hibernate体系结构的概要图

    它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每...

    Visual C++实践与提高-COM和COM+篇『PDF』

    10.4.2.2 Session对象 10.4.2.3 Request对象 10.4.2.4 Response对象 10.4.2.5 Server对象 10.4.2.6 ObjectContext对象 10.4.3 创建活动服务器组件——例程ASPComSamp 10.4.4 在ASP中测试ASPComp组件 小结 第11章 从...

    07-IoC配置-scope属性

    scope属性 名称: scope类型:属性 ...request、session、application、websocket:设定创建出的对象放置在web容器对应的位置 三、bean的生命周期控制 用于控制方法的执行时机 名称: init-method, destroy-metho

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    java基础 一、仓库说明 Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结。 2、分类文档 ...会话跟踪技术,Session和Cookie详解 过滤器、监听器、拦截器,应用详解 Servlet 集成 C3P0

    超级有影响力霸气的Java面试题大全文档

    并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。 SessionBean在J2EE应用程序中被用来完成...

    零基础学ASP.NET

    页面对象:Application、Session、Cookie、Request和Response 智能表单的创建:文本、表格、图像、上传等 客户端表单验证:普通验证、自定义验证、比较验证等 超链接、页面容器、广告、日历控件 用户控件、自定义...

    零基础学ASP.net 2.0

    ◎页面对象:Application、Session、Cookie、Request和Response ◎智能表单的创建:文本、表格、图像、上传等 ◎客户端表单验证:普通验证、自定义验证、比较验证等 ◎超链接、页面容器、广告、日历控件 ◎用户控件...

    经典的PHP验证码类.zip

    在脚本code.php中,使用session_start()开启用户会话控制,然后包含验证码类Vcode所在文件vcode.class.php,创建该类对象并直接输出。就可以将随机生成的验证码图片发送出去,同时会自动将这个验证码字符串保存在...

    Spring面试题

    控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在 Spring 框架中是 IOC 容器) 负责将...

    ASP对象全接触资料集

    | | | ├─────────使用组件和对象.txt | | | ├─────────使用脚本语言.txt | | | ├─────────使用集合.txt | | | ├─────────关于 ASP 应用程序.txt | | | ├──────...

    网站设计方案(完整版).doc

    它充当数据存储源的代理,并负责 创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的 ,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数 据库时,可以为...

Global site tag (gtag.js) - Google Analytics