监听器和过滤器
监听器
* 作用:
* 监听request、session、application三个域对象的创建,销毁和数据的变更
* 使用:
* 1、创建一个普通java类实现指定的接口
1.监听request的创建和销毁:ServletRequestListener
* requestInitialized(ServletRequestEvent sre)
* requestDestroyed(ServletRequestEvent sre)
形参:
ServletRequestEvent可以获取当前监听到的request对象,对request对象的中的资源进行操作。
2. 监听request作用域数据的变更:ServletRequestAttributeListener
* attributeAdded(ServletRequestAttributeEvent srae)
* attributeRemoved(ServletRequestAttributeEvent srae)
* attributeReplaced(ServletRequestAttributeEvent srae)
* 形参:
* ServletRequestAttributeEvent可以获取当前被监听到的request中的数据。
* geName()返回监听到的数据的键和getValue()返回监听的到的数据的值。
注意:获取的值总是第一个设置的值。
3. 监听session的创建和销毁:HttpSessionListener
* sessionCreated(HttpSessionEvent se)
* sessionDestroyed(HttpSessionEvent se)
* 形参:
* 获取当前被监听到的session对象
4 、 监听session的作用域数据的变更:
* attributeAdded(HttpSessionBindingEvent event)
* attributeRemoved(HttpSessionBindingEvent event)
* attributeReplaced(HttpSessionBindingEvent event)
* 形参:
* 获取当前监听到的session中的数据 getName()返回数据的键名,getValue()返回数据的值
5. 监听application对象的创建和销毁:ServletContextListener
* contextInitialized(ServletContextEvent sce)
* contextDestroyed(ServletContextEvent sce)
* 形参:
* 获取application对象
6. 监听application对象的数据的变更:ServletContextAttributeListener
* attributeAdded(ServletContextAttributeEvent event)
* attributeRemoved(ServletContextAttributeEvent event)
* attributeReplaced(ServletContextAttributeEvent event)
* 形参:获取当前被监听的数据 getName()返回数据的键名,getValue()返回数据的值
7、在项目中的web.xml中配置监听器,让监听器生效
* <listener>
<listener-class>监听器类的包名和类名</listener-class>
</listener>
示例:
<listener>
<listener-class>com.bjsxt.listener.MyListener</listener-class>
</listener>
案例:统计在线人数
过滤器
1.为什么需要过滤器?
* 目前我们访问Servlet,是可以直接进行访问的,没有进行任何防护。可是会造成服务器资源的浪费,以及安全性不高。我们希望真的在请求被Servlet处理之前,进行一次请求的校验,符合要求再调用对应的Servlet进行请求处理
2.过滤器使用:
2.1、创建一个普通java类并实现过滤器接口Filter
2.2、在web.xml中配置过滤器
* <filter>
<filter-name>配置的过滤器名称</filter-name>
<filter-class>要配置的过滤器的全限定路径:包名.类名</filter-class>
</filter>
<filter-mapping>
<filter-name>配置的过滤器名称</filter-name>
<url-pattern>过滤器拦截请求地址的范围</url-pattern>
</filter-mapping>
示例:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.bjsxt.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.Filter接口的方法
过滤器之doFilter方法
作用: 服务器在接收到浏览器发过来的请求后,先解析请求信息,创建对象request和response
然后根据请求URL地址判断如果符合过滤器的过滤范围,则会调用过滤器中的doFilter来
进行请求拦截,并将request和response对象作为实参传递给doFilter方法。我们
可以在doFilter方法中声明过滤器拦截代码。
参数:
ServletRequest:接收此次拦截的请求的request实参
ServletResponse:接收此次拦截的请求的response实参
FilterChain:可以进行请求放行
chain.doFilter(request, response);
技能点二:过滤器之init和destory方法
init方法:服务器启动时调用
destory方法:服务器关闭时调用
证明:过滤器的生命周期为从服务器开启到服务器关闭
4.:过滤器之拦截范围配置
拦截所有:/*
拦截部分Servlet的请求:*.do
拦截指定Servlet的请求:和要拦截的指定的Servlet的url-pattern配置完全一致即可,例如:/my
注意:过滤器之间会出现多重拦截,如果是按照拦截拦截范围的大小在web.xml中自大而小进行的配置
则会先执行大范围的拦截器,再执行小范围的拦截器。
过滤器案例:参照整合项目中的过滤器写法
使用过滤器统一编码格式
使用过滤器进行session管理
使用过滤器进行权限管理
5、过滤器案例之统一请求编码格式
在doFilter中使用
//设置请求编码格式
request.setCharacterEncoding("utf-8");
//设置响应编码格式
response.setContentType("text/html;charset=utf-8");
注意:一旦使用了过滤器,就需要在过滤其中使用编码格式设置,如果不设置,则需要在每个servlet中是设置编码格式设置。
6.