过滤器,监听器
Posted fengfusheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过滤器,监听器相关的知识,希望对你有一定的参考价值。
1 过滤器
1.1 过滤器简介
1)过滤器其实就是一个接口,Filter, javax.servet.Filter
2)过滤器就是一个对象,可以在请求一个资源(静态或动态资源),或响应一个资源,或请求和响应一个资源的时候,执行过滤任务!!!!
3)其实就是在执行servlet之前,执行的逻辑,可以省却servlet中重复的部分。
Servlet的三大组件:( 1)都需要交给web服务器运行 2)在web.xml文件中配置 )
(servlet)Servlet接口:用于开发动态网页=>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/任意路径.后缀名
注意:
1)url-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.xml中filter-mapping的配置决定顺序。先配置的优先被执行。
1.5 应用-使用网页内容压缩
(使用装饰着模式对request和response进行方法的装饰)
使用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 、ServletRequest、HttpSession
事件:
对象创建或销毁:ServletContextEvent、ServletRequestEvent、HttpSessionEvent
操作属性: ServletContextAttributeEvent、ServletRequestAttributeEvent、HttpSessionBindingEvent
事件监听器: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 |
以上是关于过滤器,监听器的主要内容,如果未能解决你的问题,请参考以下文章