Java web基础知识 第五节 会话及Servlet高级

一、会话

1. 会话概述

  1. 当用户通过浏览器访问web应用时,通常情况下,服务器需要对用户的状态进行跟踪。
    例如:用户在网站结算商品时,web服务器必须根据请求用户的身份,找到该用户所购买的商品。
  2. 在web开发中,服务器跟踪用户信息的技术称为会话技术。
  3. 为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session

2. Cookie对象

  1. Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。

  2. 识别返回用户包括三个步骤:
    服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
    浏览器将这些信息存储在本地计算机上,以备将来使用。
    • 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器服务器将使用这些信息来识别用户

  3. Servlet Cookie 方法

    	1	public void setDomain(String pattern)	该方法设置 cookie 的domain属性。该属性用来指定浏览器访问的域,例如 runoob.com。默认值为当前主机名。
    	
    	2	public String getDomain()				该方法获取 cookie 适用的域,例如 runoob.com。
    	
    	3	public void setMaxAge(int expiry)		该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效,浏览器关闭时,删除这个Cookie对象。
    	
    	4	public int getMaxAge()					该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
    	
    	5	public String getName()					该方法返回 cookie 的名称。名称在创建后不能改变。
    	
    	6	public void setValue(String newValue)	该方法设置与 cookie 关联的值。
    	
    	7	public String getValue()				该方法获取与 cookie 关联的值。
    	
    	8	public void setPath(String uri)			该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
    	
    	9	public String getPath()					该方法获取 cookie 适用的路径。
    	
    	10	public void setSecure(boolean flag)		该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
    	
    	11	public void setComment(String purpose)	设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
    	
    	12	public String getComment()				获取 cookie 的注释,如果 cookie 没有注释则返回 null
  4. Servlet Cookie 处理需要对中文进行编码与解码

    方法如下:
    String str = java.net.URLEncoder.encode(“中文”,“UTF-8”);
    String str = java.net.URLDecoder.decode(“编码后的字符串”,“UTF-8”);

    注意:在创建一个同名的cookie,如果path属性也相同,则新的覆盖旧的,否则为两个。

3. Session对象:

  1. Session是一种将会话数据保存到服务器端的技术

  2. 当第一次访问网站时,通过HttpSession session=request.getSession();命令来创建一个Session对象,同时也创建一个标识该session对象的Session ID

    Cookie cookie=new Cookie(“JSESSIONid”,session.getId());
    	//		创建cookie(注意这个cookie带有Session ID)。
    
    response.addCookie(cookie);
      	/		命令将这个cookie保存到客户端浏览器。
      	/		Session用于保存这个用户的会话信息。
    
  3. 当同一个用户再次访问这个网站时,浏览器会自动通过HTTP的请求头将Cookie中保存的Session ID再携带过来.

  4. 这时HttpSession session=request.getSession();命令就不会再去分配一个新的Session和Session ID,而是在服务器的硬盘中去寻找和这个Session ID同名的Session对象.

  5. 将这之前为这个用户保存的会话信息读出,从而达到跟踪这个用户的目的。

  6. 注意Session以键值对的形式使用。

    另外注意两点:
    	(1)HttpSession session=request.getSession(false);含义是如果服务器找到Session ID则得到用户指定的Session,否则session==null,并不创建session。
    	(2)HttpSession超时管理   HttpSession有效时间为30分钟,在tomcat\config\web.xml可以找到配置信息:
    配置信息:
               <session-config>
                     <session-timeout>30</session-timeout>
               </session-config>
    	如果该值设置为0或负数,则表示会话永不超时。最好在自己的web.xml中设置。
    	你需要在向客户端发送任何文档内容之前调用 request.getSession()
  7. 下面总结了 HttpSession 对象中可用的几个重要的方法:

    下面总结了 HttpSession 对象中可用的几个重要的方法:
    	1	public Object getAttribute(String name)
    	该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null2	public Enumeration getAttributeNames()
    	该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
    	
    	3	public long getCreationTime()
    	该方法返回该 session 会话被创建的时间,自格林尼治标准时间 197011 日午夜算起,以毫秒为单位。
    	
    	4	public String getId()
    	该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
    	
    	5	public long getLastAccessedTime()
    	该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 197011 日午夜算起,以毫秒为单位。
    	
    	6	public int getMaxInactiveInterval()
    	该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
    	
    	7	public void invalidate()
    	该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
    	
    	8	public boolean isNew()
    	如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true9	public void removeAttribute(String name)
    	该方法将从该 session 会话移除指定名称的对象。
    	
    	10	public void setAttribute(String name, Object value) 
    	该方法使用指定的名称绑定一个对象到该 session 会话。
    	
    	11	public void setMaxInactiveInterval(int interval)
    	该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。
    

二、Servlet高级

1. Servlet高级-概述

  1. Filter和Listener是Servlet规范中的两个高级特性,不同于Servlet,它们不用于处理客户端请求。
  2. Filter用于对request、response对象进行修改
  3. Listener用于对context、session、request事件进行监听。
  4. 善用Servlet规范中的这两个高级特性能够轻松地解决一些特殊问题。

2. Filter过滤器

  1. 什么是Filter
    Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。
    这就好比现实中的污水净化设备,它可以看作一个过滤器,专门用于过滤污水杂质。
  2. Filter在Web应用中的拦截过程如下:
    1、当浏览器访问服务器中的目标资源时,会被Filter拦截在Filter进行预处理操作,然后再请求转发给目标资源。
    2、当服务器接收到这个请求后会对其进行响应,在服务器处理响应的过程中,也需要先将响应结果发送给过滤器,在过滤器中对响应结果进行处理后,才会发送给客户端
  3. 其实,Filter过滤器就是一个实现了javax.servlet.Filter接口的类,在javax.servlet.Filter接口中定义了三个方法。
    具体如表所示。
    		init(FilterConfig  filterConfig)   用来初始化过滤器
    		doFilter(ServletRequest  request,ServletResponse  response,FilterChain  chain)
    			/	doFilter()方法有多个参数,
    			/	其中,参数request和response为web服务器或Filter链中的上一个Filter传递过来的请求和响应对象;
    			/	参数chain代表当前Filter链的对象,
    			/	在当前Filter对象中的doFilter()方法内部需要调用FilterChain对象的doFilter()方法,才能把请求交付给Filter链中的下一个Filter或者目标程序去处理。
    		destroy():用于释放被Filter对象打开的资源。
    				
    这三个方法都是Filter的生命周期方法,
    	其中init()方法在Web应用程序加载的时候调用,
    	    destroy()方法在Web应用程序卸载的时候调用,这两个方法都只会被调用一次,
    	  而doFilter()方法只要有客户端请求时就会被调用,并且Filter所有的工作集中在doFilter()方法中。
    
  4. Filter映射
    1. 使用通配符*拦截用户的所有请求

    2. Filter的<filter-mapping>元素用于配置过滤器拦截的资源信息,如果想让过滤器拦截所有的请求访问,那么需要使用通配符“*”来实现.

      具体示例如下。
      		<filter>
      		        <filter-name>Filter1</filter-name>
      		        <filter-class>cn.itcast.chapter08.filter.MyFilter</filter-class>
      		</filter>
      		<filter-mapping>
      		          <filter-name>Filter1</filter-name>
      		          <url-pattern>/*</url-pattern>
      		</filter-mapping>
      
    3. 拦截不同方式的访问请求
      在web.xml文件中,一个<filter-mapping>元素用于配置一个Filter所负责拦截的资源。
      <filter-mapping>元素中有一个特殊的子元素<dispatcher>该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式

      <dispatcher>元素的值共有4个,具体如下:
      		1)REQUEST 
      		      当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()forward()方法访问时,那么该过滤器将不会被调用。
      		2)INCLUDE
      		     如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
      		3)FORWARD 
      		     如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
      		4)ERROR 
      		    如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
      
  5. Filter链
    1. 在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。
    2. 如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(也叫过滤器链)。
    3. Filter链用FilterChain对象来表示.
    4. FilterChain对象中有一个doFilter()方法,该方法的作用就是让Filter链上的当前过滤器放行,使请求进入下一个Filter。
    5. 最终将请求发送给目标资源。当Web服务器对这个请求做出响应时,也会被过滤器拦截,这个拦截顺序与之前相反,最终将响应结果发送给客户端。

3. Listener监听器

  1. 在程序开发中,经常需要对某些事件进行监听,如监听鼠标单击事件、监听键盘按下事件等,此时就需要使用监听器,监听器在监听的过程中会涉及几个重要组成部分。

    具体如下:
    (1)事件(Event):用户的一个操作,如单击一个按钮、调用一个方法、创建一个对象等。
    (2)事件源:产生事件的对象。
    (3)事件监听器(Listener):负责监听发生在事件源上的事件。
    (4)事件处理器:监听器的成员方法,当事件发生的时候会触发对应的处理器(成员方法)。

  2. 当用户进行一个操作触发事件源上的事件时,就会被事件监听器监听到,当监听器监听到事件发生时,相应的事件处理器就会对发生的事件进行处理。
    事件监听器在进行工作时,可分为几个步骤,具体如下。
    (1)将监听器绑定到事件源,也就是注册监听器。
    (2)事件发生时会触发监听器的成员方法,即事件处理器,传递事件对象。
    (3)事件处理器通过事件对象获得事件源,并对事件源进行处理。

  3. 在开发Web应用程序时,也经常会使用监听器,这个监听器也被称为Servlet事件监听器
    Servlet事件监听器就是一个实现了特定接口的Java程序,专门用于监听Web应用程序中ServletContext、HttpSession和ServletRequest等域对象的创建和销毁过程,监听这些域对象属性的修改以及感知绑定到HttpSession域中某个对象的状态

    Servlet规范中共有8种监听器,具体如表所示。
    		类型												描述
    		ServletContextListener					用于监听ServletContext对象的创建与销毁过程
    		HttpSessionListener						用于监听HttpSession对象的创建与销毁过程
    		ServletRequestListener					用于监听ServletRquest对象的创建和销毁过程
    		ServletContextAttributeListener			用于监听ServletContext对象的属性变更
    		HttpSessionAttributeListener			用于监听HttpSession对象的属性变更
    		ServletRequestAttributeListener			用于监听ServletRequest对象的属性变更
    		HttpSessionBindingListener				用于监听JavaBean对象绑定到HttpSession对象和从HttpSession对象解绑的事件
    		HttpSessionActivationListener			用于监听HttpSession中对象活化和钝化的过程
    
  4. 上表中列举了全部8种Servlet事件监听器,并对它们分别进行了简单地描述。在描述HttpSessionActivationListener时涉及到了活化和钝化的概念, HttpSession对象从内存中转移至硬盘的过程称为钝化HttpSession对象从持久化的状态变为运行状态的过程被称为活化

  5. 上述监听器根据监听事件的不同可以将其分为三类,具体如下。

    1)用于监听域对象创建和销毁的事件监听器:
    		(ServletContextListener接口、HttpSessionListener接口、ServletRequestListener接口)。
    (2)用于监听域对象属性增加和删除的事件监听器:
    		(ServletContextAttributeListener接口、HttpSessionAttributeListener接口、ServletRequestAttributeListener接口)。
    (3)用于监听绑定到HttpSession域中某个对象状态的事件监听器:
    		(HttpSessionBindingListener接口、HttpSessionActivationListener接口)。
    
  6. 在Servlet规范中,这三类事件监听器都定义了相应的接口,在编写事件监听器程序时只需实现对应的接口就可以。

  7. Web服务器会根据监听器所实现的接口,把它注册到被监听的对象上,当触发了某个对象的监听事件时,Web容器将会调用Servlet监听器与之相关的方法对事件进行处理。


End.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值