五、ServletContext,会话管理

ServletContext

什么是Servlet上下文?

  Servlet上下文又叫做:ServletContext。容器启动之后,容器会为每个web应用创建一个实现了ServletContext接口要求的对象,该对象就称之为servlet上下文。

  当WEB服务器启动时,会为每一个WEB应用程序(webapps下的每个目录就是一个应用程序)创建一块共享的存储区域。

  ServletContext也叫做“公共区域”,也就是同一个WEB应用程序中,所有的Servlet和JSP都可以共享同一个区域。

ServletContext特点:

  1、ServletContext生命周期:在WEB服务器启动时创建,服务器关闭时销毁。

  2、唯一性,一个web应用对应一个servlet上下文

  3、一直存在,只要容器没有关闭,应用没有被卸载,servlet上下文就会一直存在。

如何获取Servlet上下文?

  GenericServlet,ServletConfig,HttpSession,FilterConfig都提供了一个方法getServletContext()来获得Servlet上下文。

  //通过当前Servlet类的对象,得到与它关联的ServletContext对象,也就是上下文
      ServletContext application = this.getServletContext();

ServletContext上下文作用:

  1、绑定数据

    setAttribute,removeAttribute,getAttribute在满足使用条件情况下,优先使用生命周期短的(request<session<ServletContext)

  2、读取全局的初始化参数

    首先在web.xml中这么配置

    <!-- 配置全局的初始化参数 -->
    <context-param>
      <param-name>company</param-name>
      <param-value>网易雷火游戏</param-value>
    </context-param>
 
 
HttpSession(私有区域) 与 ServletContext(公共区域) 的区别是什么?
1、作用范围不同:HttpSession是针对每一个客户端浏览器单独有一个。
         ServletContext是针对每一个WEB应用程序有一个
2、存活时间不同:HttpSession第一次访问服务器,服务器端调用request.getSession()时创建,访问间隔时间超过30分钟就销毁。
         ServletContext服务器启动时创建,服务器停止时销毁。
 
 
=======================================================================================================================================
 
会话管理
 
什么是会话?
  浏览器请求一次服务器,服务器接收请求,处理之后,给出响应,这就是一次会话。
 
什么是会话管理(跟踪)?
  在 多次浏览器跟服务器的会话过程中,服务器必须要记录客户端浏览器的一些信息,这个叫会话跟踪。
 
会话的作用?
   因为HTTP 协议是一种“无状态”协议(断开连接式协议),也就是服务器给客户端浏览器响应之后,就会断开网络连接。下次客户端浏览器请求服务器时会再建立网络连接。实际上HTTP协议是为了保证服务器的性能。而这种情况下,默认服务器是不会记录客户端浏览器的信息的。
  所以会话跟踪 是用于维持客户端和服务器端通信
 
如何进行会话管理?
  Cookie:将状态保存在浏览器,每次向服务器端发请求时都将存在客户端的数据随着请求发送到服务器端,修改后再发回到客户端保存的这种模式叫做Cookie。
  Session:将状态保存在服务器,并且为这组数据标示一个编号,只将编号发回给客户端。当客户端向服务器发送请求时只需要将这个编号发过来,服务器端按照这个编号找到对应的数据进行管理的这种模式。
 
=======================================================================================================================================

什么是cookie?

  服务器临时存放在浏览器端的少量数据。

Cookie工作原理:

  当浏览器访问服务器时,服务器会将少量数据发送给浏览器(使用set-cookie消息头);浏览器会将这些数据临时保存下来;当浏览器再次访问服务器时,会将之前保存的数据发送给服务器(使用cookie消息头)

cookie生存时间:默认情况下,浏览器会将cookie保存在内存里面。只要浏览器不关闭,cookie就会一直保存,浏览器关闭cookie被删除。

  cookie.setMaxAge(int seconds)

    seconds>0,浏览器会将cookie保存在硬盘上(文件形式存放),超过时间浏览器则删除cookie

    seconds<0,即默认值,将cookie保存在内存。 

    seconds=0,立即删除cookie

编码问题:cookie只能保存合法的ASCII码字符,如果是中文需要将中文转换成合法的ASCII字符串。

  String URLEncoder.encode(String str,String charset)

  String URLDecoder.decode(String str,String charset)

cookie的限制

  • 可以被用户禁止
  • 只能保存少量数据(大约4K)
  • 保存数量有限制(大约几百个)
  • 只能保存字符串,对于中文需要编码。

=======================================================================================================================================
 
什么是HttpSession?
  服务器端为保存状态而创建的一个特殊的对象。
 
HttpSession的原理:
  浏览器访问服务器时,服务器会创建一个session对象(该对象有一个唯一的ID,一般称之为sessionId),服务器会将这个sessionId发送给浏览器(默认以cookie方式发送),浏览器会将sessionId保存下来(在内存中);当浏览器再次访问服务器时,会将sessionId发送给服务器,服务器依据sessionId找到对应的session对象。
 
如何获取HttpSession?
  HttpSession s=request.getSession(boolean flag)
    flag为true时,先查看请求当中有没有sessionId,若没有,则创建session对象;若有,则依据该sessionId去查找对应的session对象(找到就返回,找不到就创建一个新的session对象)
    flag为false时,先查看请求当中有没有sessionId,若没有,不创建session对象;若有,则依据该sessionId去查找对应的session对象(找到就返回,找不到就返回null)
    flag为空时,HttpSession s=request.getSession()等价于上面参数为true时

 HttpSession何时被创建,何时被销毁呢?

创建:第一次请求服务器,服务器端的Servlet调用了 request.getSession()方法时被创建。

销毁:如果浏览器间隔时间超过30分钟没有访问服务器,则服务器会销毁对应的HttpSession对象。(默认30分钟是可以配置的。)

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

猜你喜欢

转载自www.cnblogs.com/danielJinyu/p/11364056.html