过滤器(filter)、监听器(listener)
---------------------------------------------------------------------------------------------------------------------------
SessionID原理概述:
浏览器发送一次请求到服务器,服务器首先判断,该请求是否携带一个SessionID值如果这次请求没有携带一个SessionID值,服务器就知道了,这是第一次来访问该服务器浏览器与该服务器开始建立会话服务器会在相应请求的同时,将产生一个SessionID,作为该次会话的标识再把这个SessionID发给浏览器,浏览器就拥有一个SessionID了当再次访问该服务器时,浏览器会携带那个SessionID,被传到服务器服务器首先判断该请求是否携带一个SessionID值,此时有了,代表这不是一个新的会话的请求如果浏览器两个请求之间的时间太长,超出服务器等待的时间,服务器会删除这个session对象删除后,再次发送到该服务器,因为服务器里没有这个session对象了,就不能判断请求是否携带SessionID值也就是说判断不出来,就认为这是一个新的会话开始,又会产生一个SessionID,作为这次新会话的标识又把这个SessionID发给浏览器,浏览器就拥有一个新的SessionID了在会话开始时,服务器会自动分配一个空间(session对象),SessionID就在session对象里
-----------------------------------------------------------------------------
filter翻译为过滤器。在web项目中,经常需要在正式处理请求前,做一些特殊的处理或常用的例程,于是就发明了这个filter。
注意:chain参数则通过调用自己的doFilter方法来将请求向下传递,如果没有调用doFilter()方法,则相当于阻止了本次请求。 创建如下:
/*这个是FirstFilter过滤器类*/ package com.yy.servlet.web.filter; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class FirstFilter implements javax.servlet.Filter{ public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException { /*如果没有调用doFilter()方法,则相当于阻止了本次请求。*/ filter.doFilter(request, response); System.out.println("filter is ok"); } public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }servlet规范当中定义的一种特殊的组件,用来监听servlet容器产生的事件并进行响应的处理。
容器创建或者销毁request,session,ServletContext(上下文/环境)时产生的事件(统计在线人数)。
调用了以上三个对象(request,response,ServletContext)的setAttribute,removeAttribute方法时产生的事件。
step1,写一个java类,实现相应的监听器接口(共有8个接口)。要依据监听的事件类型来选择相应的监听器接口,比如要监听session对象的创建和销毁,要实现HttpSessionListener。
step2,在监听器接口方法中,实现相应的监听处理逻辑。比如,session对象被删除了,将人数减1。
step3,注册(在web.xml文件中配置即可)。