listener&filter

来源:互联网 发布:在线剪辑音乐软件 编辑:程序博客网 时间:2024/05/16 14:35


1.   什么是监听器

                     Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext

2.监听器的作用
       1.监听web对象创建与销毁.
2.监听web对象的属性变化
3.监听session绑定javaBean操作.
3.监听机制相关概念

1.事件----一件事情

2.事件源---产生这件事情的源头

3.注册监听---将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。

4.监听器---对某件事情进行处理监听的一个对象

 

web监听器介绍

1.javaweb监听器介绍
1.监听web对象创建与销毁的监听器

                            ServletContextListener

                            HttpSessionListener

                            ServletRequestListener  

2.监听web对象属性变化

                            ServletContextAttributeListener

                            HttpSessionAttributeListener

                            ServletRequestAttributeListener   

3.监听session绑定javaBean

                            HttpSessionBindingListener

                            HttpSessionActivationListener


session监听器:

public class MyHttpSessionListener implements HttpSessionListener {public void sessionCreated(HttpSessionEvent se) {System.out.println("HttpSession对象创建了");}public void sessionDestroyed(HttpSessionEvent se) {System.out.println("HttpSession对象销毁了");}}
servletContextListener监听器
public class MyServletContextListener implements ServletContextListener{public void contextInitialized(ServletContextEvent sce) {System.out.println("ServletContext对象创建了");}public void contextDestroyed(ServletContextEvent sce) {System.out.println("ServletContext对象销毁了");}}
ServletReques监听器:
public class MyServletRequestListener implements ServletRequestListener {public void requestDestroyed(ServletRequestEvent sre) {System.out.println("ServletRequest销毁了");}public void requestInitialized(ServletRequestEvent sre) {System.out.println("ServletRequest创建 了");}}


2.   javaweb监听器创建步骤

Ø  创建一个类,实现指定的监听器接口      

Ø  重写接口中的方法.

Ø  在web.xml文件中配置监听

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">    <listener><listener-class>com.itheima.listener.MyServletContextListener</listener-class></listener><listener><listener-class>com.itheima.listener.MyHttpSessionListener</listener-class></listener><listener><listener-class>com.itheima.listener.MyServletRequestListener</listener-class></listener>  <listener><listener-class>com.itheima.attributelistener.MyServletRequestListener</listener-class></listener><listener><listener-class>com.itheima.test.MyServletContextListener</listener-class></listener><listener><listener-class>com.itheima.test.MySessionListener</listener-class></listener>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>


1.ServletContext对象的创建与销毁监听

Ø  ServletContext对象的创建与销毁分析

ServletContext对象是服务器开启时创建。服务器关闭时销毁。

Ø  监听ServletContext对象的创建与销毁

 

2.HttpSession对象的创建与销毁监听

Ø  1.HttpSession对象的创建与销毁分析

session对象创建:取决于请求中是否有jsessinid,如果有,可能会获取一个已经存在的session对象。如果没有,会创建一个新的session对象.

销毁session:

              1.默认超时 30分钟

              2.关闭服务器

              3.invalidate()方法

              4.setMaxInactiveInterval(intinterval) 可以设置超时时间

Ø  2.监听HttpSession对象的创建与销毁

 

3.HttpServletRequest对象的创建与销毁监听

Ø  1.HttpServletRequest对象的创建与销毁分析

request对象是发送请求时创建,当响应产生时,销毁.

Ø  2.监听HttpServletRequest对象的创建与销毁

 

演示监听属性变化

1.javaweb中监听属性变化API介绍

            ServletContextAttributeListener      |   HttpSessionAttributeListener|    ServletRequestAttributeListener


3.   演示监听session中属性变化

 

演示监听session绑定javaBean

1.HttpSessionBindingListener监听器功能介绍

                     使javaBean对象在被绑定到会话或从会话中取消对它的绑定时得到通知

2.HttpSessionActivationListener监听器功能介绍

                     绑定到会话的对象可以侦听通知它们会话将被钝化和会话将被激活的容器事件

3.注意事项

                     这两个监听器比较特殊,它是由javaBean来实现的,并且不需要在web.xml文件中注册监听.

                     javaBean必须是序列化的.

4.演示HttpSessionBindingListener功能

                     javaBean自动感知绑定到session中以及从session中移除.

                     public voidvalueBound(HttpSessionBindingEvent event) {

                            System.out.println("绑定了user对象到了session");

                     }

 

                     public voidvalueUnbound(HttpSessionBindingEvent event) {

                            System.out.println("从session中移除了user对象");

                     }

public class User implements Serializable, HttpSessionBindingListener{private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void valueBound(HttpSessionBindingEvent event) {System.out.println("user对象被绑定了");}public void valueUnbound(HttpSessionBindingEvent event) {System.out.println("user对象解除被绑定了");}}
5.演示HttpSessionActivationListener功能

                     1.bean1.jsp中向session存储一个user对象

                     2.bean2.jsp中从session中获取user对象的name属性

                     3.User类实现接口HttpSessionActivationListener,可以监听到活化与钝化操作

                     4.做一个配置文件,来设定当活化与钝化操作时文件的位置.

                           

                            在meta-inf目录下创建一个context.xml文件

                            <Context>

                                   <ManagerclassName="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">

                                          <StoreclassName="org.apache.catalina.session.FileStore"directory="it315"/>

                                   </Manager>

                            </Context>

监听器案例--定时销毁过期session分析

1.功能描述

                     如果session对象超过五秒没有使用就销毁。

2.分析

怎样可以将每一个创建的session全都保存起来?

我们可以做一个HttpSessionListener,当session对象创建时,就将这个session对象装入到一个集合中.将集合保存到ServletContext域中。

怎样可以判断session过期了?

在HttpSession中有一个方法public long getLastAccessedTime()

它可以得到session对象最后使用的时间。

可以使用invalidate方法销毁。

       我们上面的操作需要使用任务调度功能.

               在java中有一个Timer定时器类

      

关于三个域对象获取

如果在Servlet中要获取 request在方法上就有,request.getSession()   getServletContext();

如果我们有request对象了, request.getSession()   request.getSession().getServletCotnext();

程序在使用时,需要考虑并发问题,因为我们在web中,它一定是一个多线程的,那么我们的程序对集合进行了添加,还有移除操作。

 

4.   步骤分析

1.      创建一个ServletContext创建与销毁监听器,在ServletContext对象创建时,将集合创建出来并保存到ServletContext中

2.      创建一个HttpSession创建与销毁监听器,当创建一个HttpSession对象时,将session对象获取到保存到从ServletContext获取的集合中

3.      在ServletContext的监听器内部创建定时器来完成定时销毁session操作.

监听器案例--定时销毁过期session实现


1.什么是Filter及其作用介绍

                     Filter是sun公司中servlet2.3后增加的一个新功能.              

    Servlet规范中三个技术  Servlet  Listener Filter

   在javaEE中定义了一个接口 javax.servlet.Filter来描述过滤器

   通过Filter可以拦截访问web资源的请求与响应操作.

  WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

2.Filter API介绍     
Filter是javax.servlet包下的一个接口主要有以下三个方法

1.Filter创建步骤介绍

                     Filter创建步骤:

                            1.创建一个类实现javax.servlet.Filter接口

                            2.得写接口方法

                            3.在web.xml文件中配置Filter  

Filter在web.xml文件中配置的目的:

                            1.配置拦截什么样的资源。

                            2.Filter初始化

<filter>       <filter-name>demo1Filter</filter-name>       <filter-class>cn.itcast.web.filter.Demo1Filter</filter-class></filter><filter-mapping>       <filter-name>demo1Filter</filter-name>       <url-pattern>/demo1</url-pattern></filter-mapping>

2.FilterChain功能介绍

FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。

1.   Filter链介绍

     多个Filter对同一个资源进行了拦截,那么当我们在开始的Filter中执行

      chain.doFilter(request,response)时,是访问下一下Filter,直到最后一个Filter执行

      时,它后面没有了Filter,才会访问web资源。

Ø  关于多个FIlter的访问顺序问题

     如果有多个Filter形成了Filter链,那么它们的执行顺序是怎样确定的?

     它们的执行顺序取决于<filter-mapping>在web.xml文件中配置的先后顺序。

<filter><filter-name>MyFilter2</filter-name><filter-class>com.itheima.filter.Myfilter2</filter-class></filter> <filter><filter-name>MyFilter</filter-name><filter-class>com.itheima.filter.MyFilter</filter-class></filter> <filter-mapping><filter-name>MyFilter2</filter-name><url-pattern>/*</url-pattern></filter-mapping> --><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping> 


2.Filter生命周期

                     当服务器启动,会创建Filter对象,并调用init方法,只调用一次.

                     当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,

                     这个方法是真正拦截操作的方法.

                     当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.

FilterConfig介绍

1.FilterConfig功能介绍

                            在Filter中的init方法上有一个参数叫FilterConfig                     

                            FilterConfig是Filter的配置对象                     

                            它的作用:

                                   1.获取Filter的名称  

                                   2.获取初始化参数                            

                                   3.获取ServletContext对象                              

2.FilterConfig常用API

              

3.FilterConfig功能演示

                    

Filter配置详解

1.Filter基本配置介绍

                            <filter>

                                   <filter-name>filter名称</filter-name>

                                   <filter-class>filter类全名</filter-class>

                            </filter>

                            <filter-mapping>

                                   <filter-name>filter名称</filter-name>

                                   <url-pattern>映射路径</url-pattern>

                            </filter-mapping>

2.关于url-pattern配置

                     1.完全匹配

                            要求必须以"/"开始.

                     2.目录匹配

                            要求必须以"/"开始,以*结束.                                      

                     3.扩展名匹配

                            不能以"/"开始,以*.xxx结束.

3.关于servlet-name配置

                     针对于servlet拦截的配置  <servlet-name>配置

                     在Filter中它的配置项上有一个标签

                     <servlet-name>它用于设置当前Filter拦截哪一个servlet。

                     是通过servlet的name来确定的。

5.   关于dispatcher配置

可以取的值有  REQUEST FORWARD  ERROR  INCLUDE                                

它的作用是:当以什么方式去访问web资源时,进行拦截操作.                              

1.REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的它也是默认值

2.FORWARD 它描述的是请求转发的拦截方式配置

3.ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

4.INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用


filter实现自动登陆程序:

@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2)throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest request2 =(HttpServletRequest) request;HttpServletResponse response2=(HttpServletResponse) response;//首选不是登陆相关的且session中,没有登陆过才自动登陆String uri = request2.getRequestURI();String path = request2.getContextPath();String paths = uri.substring(0);if(!("/login.jsp".equals(paths)||"/servlet/loginser".equals(paths))){Object attribute = request2.getSession().getAttribute("user");if(attribute==null){Cookie[] cookies = request2.getCookies();Cookie c=null;if(cookies!=null){for(int i=0;i<cookies.length;i++){if("user".equals(cookies[i])){c=cookies[i];}}}//登陆if(c!=null){//先保存用户名密码   request2.getSession().setAttribute("user","");}}}//service.login(c;//放行arg2.doFilter(request, response);}




原创粉丝点击