servlet过滤器和监听器

来源:互联网 发布:阿里云备案服务器费用 编辑:程序博客网 时间:2024/05/03 23:30

 Servlet过滤器(Filter)

过滤器是用于过滤Servlet的请求和响应,过滤器是存在于请求和被请求资源之间的。
过滤器就像当于一个中间件,请求要经过过滤器,然后过滤器才去掉用Servlet,Servlet的响应也会被过滤器截获并作相应的处理。

Filter是一个接口,要写一个自己的Filter就只能实现Filter接口。
Filter也有自己的生命周期,他的生命周期和Servlet比较相似,也是会先调用init()方法,然后再调用核心的处理过滤的方法doFilter(),这个方法中可定义了过滤规则,然后是destory()方法销毁Filter对象。

dofilter(ServletRequest request,ServletResponse response,FilterChain chain)
这个是过滤的核心方法,FilterChain的方法doFilter(ServletRequest request, ServletResponse response)也就是用过滤后的请求调用资源的方法,如果不写这个方法,也就算不会去调用相应的资源。
 
Filter的配置

Filter的配置和Servlet相似。
 <filter>
  <filter-name>SessionFilter</filter-name>
  <filter-class>alan.filter.SessionFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>SessionFilter</filter-name>
  <url-pattern>/protected/*</url-pattern>
  <!--这里的url-pattern就是要过滤的Servlet的url-pattern-->
  <dispatcher>request</dispatcher>
  <dispatcher>forward</dispatcher>
  <dispatcher>include</dispatcher>
  <!--上面的三个是过滤的范围-->
 </filter-mapping>
CharArrayWriter类,是一个将数据保存在字符数组中的输出流,我们可以使用它来构造一个PrintWriter对象,也就实现了向内存输出。CharArrayWriter类的toString()和toCharArray()方法就可以取得写入内存中的数据。
注意:CharArrayWriter类是一个不会真正输出的类,他的write()方法只会将内容写入字符数组,而且这个字符数组是会自动增长的。

Servlet监听器

以下是3个Listener接口。
ServletRequestListener
HttpSessionListener
ServletContextListener
这三个监听器接口,分别监听Servlet中3种比较中要的对象的创建和销毁。这三个接口中分别有监听该对象创建和销毁事件的方法,服务器本身就是事件源。

listener的配置
<listener>
 <listener-class>alan.servlet.listener.AlanContextListener</listener-class>
        <!--listener-class也就是实现Listener接口的类-->
</listener>

Servlet中的重要对象(只针对应用)


                            数量                       生命周期                  是否线程安全
ServletContext        1                            全局的                      不安全
                                           只有在应用关闭时才销毁        需要加同步访问

HttpSession        和用户的                    局部的                      不安全
                         数量相同           只在有效时间内存在         需要加同步访问

ServletRequest       多个                       局部的                      线程安全
(HttpServletRequest)                   只在servic()和doGet()
                                                     doPost()中存在

原创粉丝点击