2019-08-09

监听器和过滤器

监听器

* 作用:

* 监听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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容