过滤器,监听器

Posted fengfusheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过滤器,监听器相关的知识,希望对你有一定的参考价值。

 

1 过滤器

1.1 过滤器简介

1)过滤器其实就是一个接口,Filterjavax.servet.Filter

2)过滤器就是一个对象,可以在请求一个资源(静态或动态资源),或响应一个资源,或请求和响应一个资源的时候,执行过滤任务!!!!

3其实就是在执行servlet之前,执行的逻辑,可以省却servlet中重复的部分。

 

Servlet的三大组件:( 1)都需要交给web服务器运行  2)在web.xml文件中配置  )

servletServlet接口:用于开发动态网页=>request,response

(过滤器)Filter接口:=>filterConfig(init),chain(doFilter)+request,response

(监听器)Listener接口:=>

 

4)过滤器的生命周期

构造方法: web应用加载时创建过滤器对象。只执行一次。证明过滤器在web服务器中是单实例的

init方法: 在创建完过滤器对象之后被调用。只执行一次

doFilter方法: 执行过滤任务方法。执行多次。

destroy方法: web服务器停止或者web应用重新加载,销毁过滤器对象。

 

5)过滤器编写步骤:

5.1 编写一个java类,实现Filter接口,并实现其中的所有方法

5.1 web.xml文件中配置Filter

 

    <!-- 过滤器配置 -->

<filter>

<!-- 内部名称 -->

<filter-name>HelloFilter</filter-name>

<!-- 类全名:包+简单类名 -->

<filter-class>gz.itcast.a_hello.HelloFilter</filter-class>

</filter>

<!-- 过滤器映射配置 -->//可以配置多个,然后按照顺序依次过滤

<filter-mapping>

<!-- 内部名称,和上面的名称保持一致! -->

<filter-name>HelloFilter</filter-name>

<!-- 需要拦截的路径 -->

<url-pattern>/hello</url-pattern>

</filter-mapping>

 5.3 Filter部署到tomcat服务器运行!!!!

 

1.2 过滤器的映射路径

过滤器中的url-pattern: 表示的这个过滤器需要拦截的目标资源路径(可以servlet路径,也可以是静 态资源名称)

Servlet中的url-pattern: 表示访问这个servlet时的路径

 

url-pattern                      浏览器访问目标资源的路径

精确过滤         /hello.html                         http://localhost:8080/day21/hello.html

/itcast/hello                     http://localhost:8080/day21/itcast/hello

 

模糊过滤        /*                            http://localhost:8080/day21/任意路径

/itcast/* http://localhost:8080/day21/itcast/任意路径

*.后缀名 http://localhost:8080/day21/任意路径.后缀名

 

注意:

1url-pattern要么以斜杠开头,要么以*开头  例如: hello

2)不能同时使用两个模糊过滤。例如 /*.do 是非法的

3)如果存在多个需要被过滤的资源,可以写多个url-pattern去过滤。

4)如果是动态资源servlet,可以使用servlet的访问名称,也可以使用内部名称

 

       <!-- 使用servlet的内部名称 -->

<servlet-name>HelloServlet</servlet-name>

 

5)过滤类型:

<!-- 过滤类型:声明哪种请求才可以被拦截(过滤) -->

<dispatcher>REQUEST</dispatcher><!-- 默认:来自于直接访问的请求才可以被拦截 -->

<dispatcher>FORWARD</dispatcher><!-- 来自于转发的请求才可以被拦截 -->

<dispatcher>INCLUDE</dispatcher><!-- 来自于包含的请求才可以被拦截 -->

<dispatcher>ERROR</dispatcher><!-- 来自于错误的请求才可以被拦截 -->

 

1.3 FilterConfig对象

FilterConfig对象,过滤器配置对象,用于加载过滤器的参数配置

filterConfig.getInitParameter("AAA")////得到一个参数

Enumeration<String> enums = filterConfig.getInitParameterNames();//所有参数

 

过滤器参数使用:

1)在web.xml文件中配置

 

<!-- 过滤器配置 -->

<filter>

<!-- 内部名称 -->

<filter-name>HelloFilter</filter-name>

<!-- 类全名:包+简单类名 -->

<filter-class>gz.itcast.a_hello.HelloFilter</filter-class>

<init-param>

<param-name>AAA</param-name>

<param-value>AAA‘value</param-value>

</init-param>

<init-param>

<param-name>BBB</param-name>

<param-value>BBB‘value</param-value>

</init-param>

</filter>

 

 

1.4 FilterChain过滤器链对象

//过滤请求代码//servlet之前执行

chain.doFilter(ServletRequest request, ServletResponse response):执行过滤器链中的下一个过滤器,如果没有下一个过滤器则执行目标资源。//放行

//过滤响应代码//servlet之后执行

 

 

*****过滤器链: 一个目标资源可以被多个过滤器过滤,那么形成一个过滤器链。***

 

注意:过滤器链中的过滤器执行顺序问题:由web.xmlfilter-mapping的配置决定顺序。先配置的优先被执行。

1.5 应用-使用网页内容压缩

(使用装饰着模式requestresponse进行方法的装饰)

使用GZIPOutputStream类进行gzip压缩。

//创建临时的字节数组容器

ByteArrayOutputStream byteArr = new ByteArrayOutputStream();

//创建GZIPOutputStream对象

GZIPOutputStream gzip = new GZIPOutputStream(byteArr);

//开始写出压缩内容//sb是需要压缩的内容

gzip.write(sb.toString().getBytes());

//刷新缓冲区

gzip.finish();

 

//从临时的字节数组容器中得到压缩后的网页内容

byte[] result = byteArr.toByteArray();

/**

 * 注意:告诉浏览器数据压缩格式  发送响应头:content-encoding:gzip

 */

response.setHeader("content-encoding", "gzip");

//把压缩后的内容输出到浏览器

response.getOutputStream().write(result);

 

2 监听器

2.1 web事件编程三要素:

事件源: ServletContext ServletRequestHttpSession

事件:

对象创建或销毁:ServletContextEventServletRequestEventHttpSessionEvent

操作属性: ServletContextAttributeEventServletRequestAttributeEventHttpSessionBindingEvent

事件监听器:ServletContextListener ServletRequestListener......

2.2 步骤

1)创建java类,实现监听器接口,实现其中的方法

2)注册监听器监听器要交给tomcat服务器运行。需要在web.xml文件中进行配置

    <!-- 注册监听器 -->

<listener>

<!-- 监听器程序全名 -->

<listener-class>gz.itcast.a_context.MyContextListener</listener-class>

</listener>

3)触发事件

ServletContext对象:代表整个web应用。

创建:web应用加载

销毁:web应用重新加载或web服务停止。

ServletContext属性

增加属性: setAttribute(name,Object);  第一次就是增加属性

修改属性: setAttribute(name,Object);  如果前面有增加了同名的属性,则修改。

删除属性: removeAttribute(name);  

ServletRequest对象:封装请求信息

创建:每次发出请求时

销毁:请求完毕后

ServletRequest属性

增加属性: setAttribute(name,Object);  第一次就是增加属性

修改属性: setAttribute(name,Object);  如果前面有增加了同名的属性,则修改。

删除属性: removeAttribute(name);  

HttpSession对象:

创建:调用request.getSession()方法

销毁:

1)默认情况下,30分钟服务器自动回收

2)设置有效时长: setMaxActiveInterval();

3)配置全局的过期时间(web.xml)

4)手动销毁: invalidate()方法

HttpSession属性

增加属性: setAttribute(name,Object);  第一次就是增加属性

修改属性: setAttribute(name,Object);  如果前面有增加了同名的属性,则修改。

删除属性: removeAttribute(name);  

 

 

2.3 常用监听事件

web事件源

web事件对象

web事件监听器

ServletContext对象

 

ServletContextEvent

创建或销毁对象时触发

ServletContextListener

ServletContext属性

ServletContextAttributeEvent

属性操作(增加属性,修改属性,删除属性)

ServletContextAttributeListener

ServletRequest对象

ServletRequestEvent

创建或销毁对象时触发

ServletRequestListener

ServletRequest属性

ServletRequestAttributeEvent

属性操作(增加属性,修改属性,删除属性)

ServletRequestAttributeListener

HttpSession对象

HttpSessionEvent

创建或销毁对象时触发

HttpSessionListener

HttpSession属性

HttpSessionBindingEvent

属性操作(增加属性,修改属性,删除属性)

HttpSessionAttributeLisener

以上是关于过滤器,监听器的主要内容,如果未能解决你的问题,请参考以下文章

过滤器监听器上下文servlet线程安全问题

过滤器,监听器

过滤器,监听器,拦截器

过滤器,拦截器,监听器的区别

过滤器,拦截器,监听器的区别

过滤器,拦截器,监听器的区别