一. 概述

  Session 指客户端(浏览器)与服务器端之间保持状态的解决方案,有时候也用来指这种解决方案的存储结构。

  当服务器端程序要为客户端的请求创建一个 Session 时,会首先检查这个请求里是否包含了一个 Session 标识(即 sessionId),如果已经包含则说明服务端之前已经为此客户端创建过 Session,服务器就按照这个 sessionId 把对应的 Session 检索出来(如果检索不到,会新建一个,这种情况可能出现在服务端已经删除了该用户对应的 Session 对象,但客户端仍然在请求的 URL 上附加了 JSESSIONID 参数)。如果客户端请求不包含 sessionId,则为此客户创建一个Session 并且生成一个与此 Session 相关联的 sessionId,这个 sessionId 将在响应中返回给客户端,供下次客户端请求用来保持与服务器端的状态信息。

Session 的实现方式

1. 通过cookie实现

  服务端为客户端创建Session时,将SessionId作为一个cookie返回给客户端。

  客户端第一次请求 --> 服务端创建Session及SessionId,返回响应(响应头包含Set-Cookie[JSESSIONID:SessionId])

  --> 客户端第二次请求,请求头(Cookie[JSESSIONID:SessionId])--> 服务端通过JSESSIONID查找为客户端创建的Session

2. URL重写(当cookie被禁用时,仍然有效)

二. Session 的生命周期

1.什么时候创建 HttpSession 对象?

① 对于JSP :是否浏览器访问服务器的任何一个 JSP ,服务器都会立即创建一个 HttpSession 对象呢?

  不一定!

  a. 若当前 JSP 是客户端访问的 WEB 应用的第一个资源,且 JSP 页面的 page 指令的 session 属性值为false,则服务器不会创建 HttpSession 对象

  b. 若当前 JSP 不是客户端访问的当前 WEB 应用的第一个资源,且其他页面已经创建过一个 HttpSession 对象,则服务器也不会为当前 JSP 页面创建一个HttpSession 对象,而会把和当前会话相关联的那个 HttpSession 对象返回给当前 JSP 页面。

② 对于 Servlet:若 Servlet 是客户端访问 WEB 应用的第一个资源,则只有调用了 request.getSession() 或 request.getSession(true) 才会创建 HttpSession 对象

2. JSP 页面中 page 指令的 session="false" 属性表示什么意思?

  表示当前 JSP 页面禁用 session 隐含对象!但是可以使用其他显示的 HttpSession 对象, 例如下方代码显示创建的 HttpSession 对象

    <%
HttpSession session2 = request.getSession();
%>

3.在Servlet中如何获取 HttpSession 对象?

  > request.getSession(boolean create)

  create 为 false,若没有和当前 JSP 页面关联的 HttpSession 对象,则返回 null;若有,则返回关联的 HttpSession 对象

  create 为 true,一定返回一个 HttpSession 对象。若没有和当前 JSP 页面关联的 HttpSession 对象,则服务器创建一个新的 HttpSession对象返回;若有,则返回关联的HttpSession 对象

  > request.getSession():等同于request.getSession(true)

4. 什么时候销毁 HttpSession 对象?

  ① 直接调用 HttpSession 的 invalidate() 方法,该方法使得 session 失效

  ② 服务器卸载了 WEB 应用

  ③ 超出了 HttpSession 的过期时间

    > 设置 HttpSession 的过期时间:session.setMaxInactiveInterval(30); 单位为秒

    > 在web.xml 文件中设置 HttpSession 的过期时间,单位为分钟 

       <session-config>
<session-timeout>30</session-timeout>
</session-config>

  ④ 并不是关闭了浏览器,就销毁了 session

三. 利用 URL 重写实现 session 跟踪

  1. Servlet 规范中引入了一种补充的会话管理机制,它允许不支持 cookie 的浏览器也可以与 WEB 服务器保持连续的会话。这种机制要求响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号(JSESSIONID)作为超链接的 URL 的一个特殊参数。

  2. URL 重写:将会话标识号以参数的形式附加在超链接的 URL 地址后面的技术称作 URL 重写。

    如果在浏览器不支持cookie 或者关闭了 cookie的情况下,WEB服务器还用能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接,form表单的action属性及重定向的URL)进行URL重写

  3. HttpServletResponse接口中定义的两个用于URL重写的方法:

    encodeURL()和encodeRedirectURL() : 二者作用一样,调用此二方法,则会自动在URL后加上 JSESSIONID 参数

  

四. 相对路径和绝对路径

1. 相对路径的问题

  ① 开发时建议写绝对路径:绝对路径肯定正确,而相对路径可能会出错

  在由Servlet 转发到JSP 页面时,此时浏览器地址栏上显示的是 Servlet 的路径, 而若转发后的 JSP 页面上得超链接还是相对于 该 JSP 页面的相对地址,则此超链接跳转可能会出现路径无法找到的问题。

2. 编写绝对路径可以避免上述问题:

  ① 在 JavaWEB 中的绝对路径:相对于当前 WEB 应用的根路径的路径

  例如:http://localhost:8080/JavaWEB01/jsp/hello.jsp

     其中"http://localhost:8080/JavaWEB01" 部分称作ContextPath(当前WEB应用的上下文路径)

  ②  绝对路径的编写

  若 "/" 代表的是站点根目录,则在前面加上 ContextPath 即可,ContextPath 可以由 request.getContextPath() 或

application.getContextPath() 获取。

  例:<a href="/testServlet"> To next page</a>                       #相对路径

    <a href="<%=request.getContextPath() %>/testServlet"> To next page</a>  #绝对路径

    response.sendRedirect(request.getServletPath() + "/jsp/query.jsp")         #绝对路径

3. JavaWEB开发中的 / 代表什么?

  ① 代表当前 WEB 应用的根路径:http://localhost:8080/JavaWEB01/

    > 请求转发时:request.getRequestDispatcher("/jsp/modify.jsp").forward(request, response);

    > web.xml 文件中映射 Servlet 的访问路径

    <servlet>

       <servlet-name>hellojsp</servlet-name>

       <jsp-file>/jsp/hello.jsp</jsp-file>

    </servlet>

    <servlet-mapping>

       <servlet-name>hellojsp</servlet-name>

       <url-pattern>/hellojsp</url-pattern>

    </servlet-mapping>

     > 各种定制标签中的 /

  ② WEB 站点的根路径:http://localhost:8080/

    > 超链接  <a href="/testServlet"> To next page</a>

    > 表单中的action属性  <form action="/login.jsp">

    > 请求重定向的时候  response.sendRedirect("/add.jsp");

  ③ "/" 含义的区分:若 / 需交由 Servlet 容器来处理则表示当前应用的根路径,若 / 交由浏览器处理则表示当前站点的根目录。

Servlet/JSP-06 Session的更多相关文章

  1. 面试题:servlet jsp cook session 背1

    一.Servlet是什么?JSP是什么?它们的联系与区别是什么? Servlet是Java编写的运行在Servlet容器的服务端程序,狭义的Servlet是指Servlet接口,广义的Servlet是 ...

  2. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  3. servlet&jsp高级:第三部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Servlet&jsp基础:第五部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. Servlet&JSP基础

    Servlet     JSP     JSP四种基本语法:     JSP注释<%--注释内容-->     JSP声明<%!变量.函数%>     JSP表达式<%= ...

  6. Servlet&JSP中的知识点

    先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...

  7. 马士兵Servlet&Jsp学习

    Servlet&JSP 1>http常见错误信息:  404--url地址找不找,  403--禁止访问  500--服务器内部错误  2>Servlet的生命周期:  *生命全过 ...

  8. 基于Servlet+jsp的web计算器

    基于Servlet+jsp的web计算器 这次老大为了让我们自己复习web中页面的跳转给布置得任务 天下代码一大抄,关键看你怎么抄 首先我想到的计算算法不是什么堆栈,是简单的(其实很复杂,但是我就只需 ...

  9. [ Servlet / JSP ] J2EE Web Application 中的 JSESSIONID 是什么?

    JSESSIONID is a cookie in J2EE web application which is used in session tracking. Since HTTP is a st ...

  10. Servlet+JSP例子

    前面两节已经学习了什么是Servlet,Servlet接口函数是哪些.怎么运行.Servlet生命周期是什么?  以及Servlet中的模式匹配URL,web.xml配置和HttpServlet.怎么 ...

随机推荐

  1. Delphi String 常用字串符处理函数

    Delphi 在面对跨平台开发,程序语言也改进不少,不过有些改进,让原本 Delphi 开发者有些不适应,最显注的就是字串处理函数了,原本 Pascal 语言字串起始由 1 开始,几乎是它的经典了,新 ...

  2. 钉钉服务器端SDK PHP版

    项目地址: https://github.com/web3d/DingtalkSDK.git 钉钉官方有些简单的demo,但封装得有些粗糙. 开发的过程中,做了一个有点小意思的工具:json数据转换为 ...

  3. Scalaz(7)- typeclass:Applicative-idomatic function application

    Applicative,正如它的名称所示,就是FP模式的函数施用(function application).我们在前面的讨论中不断提到FP模式的操作一般都在管道里进行的,因为FP的变量表达形式是这样 ...

  4. python学习笔记4(文件操作)

    文件操作: 1.f=open(”caidan”,”w”,encoding=”utf8”)      直接打开一个文件,如果文件不存在则创建文件 f.close() 2.with open (”caid ...

  5. ReportingServies——SQLServer报表开发综合实例

    如果我们安装了sqlserver2008 R2,将会自动安装一个报表开发工具 不要以为此报表开发工具只适合于sqlserver2008,其实在sqlserver2012中也是支持的,事实上我现在项目中 ...

  6. Quartz.NET开源作业调度框架系列(一):快速入门step by step

    Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...

  7. Java2_J2EE、J2SE和J2ME的区别

    解析J2EE.J2SE.J2ME.JDK的区别       本文向大家简单介绍一下JDK.J2EE.J2SE.J2ME概念及区别,J2EE,J2SE,J2ME是java针对不同的的使用来提供不同的服务 ...

  8. 关于处理addGiftmoneyAction接口报错问题的总结

    昨天UniUser中AddGiftmoneyAction接口在被调用时抛出异常,曾哥让我来解决这个问题,虽然最后查出是路径问题,但是由于解决问题 的思路不够清晰,导致浪费了大量的时间和精力,也没有给出 ...

  9. jquery easyui tabs单击刷新右键刷新

    单击刷新 $(".tabs-inner").click(function(){var currTab = self.parent.$('#tabs').tabs('getSelec ...

  10. JavaScript学习笔记-面向对象的模块化编程

    面向对象的模块化编程 模块是一个独立的JS文件,模块文件可以包含一个类定义.一组相关的类.一个实用函数库.一些待执行的代码 模块化的目标:支持大规模的程序开发,处理分散源代码的组装,并能让代码正确执行 ...