首页  韩国资源  酷站加油  我的展厅  设计名站  古典元素  推荐下载  设计欣赏  每周专访  招募精英  人才专区  网页教程  平面设计  编程开发  设计竞赛
当前位置:首页 > 编程开发 > JSP教程 > 正文
Google
WEB开发Session对象创建和控制
来源:68design.net 2007年09月03日 11:15 网友评论:0条 点击:

  首先谈一下对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.

上一篇:如何安装配置Tomcat5.0环境并绑定域名   下一篇:用Java设计自己的Annotation
收藏此页】【打印】【关闭
 相关文章  我要点评
·《NewWebPick》第16期中文大众版发布
·国外优秀Web2.0 Logo欣赏(三十五)
·国外优秀Web2.0 Logo欣赏(三十四)
·Connection" 第六刊:情迷哥伦比亚--免费下载
·国外优秀Web2.0 Logo欣赏(三十三)
·国外优秀Web2.0 Logo欣赏(三十二)
·网站设计师通过web标准
·《NewWebPick》16期付费版免费领取!

免责声明:本站刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。对本文有任何异议,请联络:68design#163.com
转载要求:作者及来源信息必需保留。转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印。



关于我们 | 在线反馈 | 广告报价 | 友情链接 | 联系我们 | 免责声明 | 在线投稿 | 网站地图
Copyright © 2003-2007 68design.net, All Rights Reserve 【找网页设计师,当然上网页设计师联盟】