• 1. 过滤器Filter
  • 2. 1. 过滤器概述过滤器:一个驻留在服务器端的Web组件,可以截取用户端和资源之间的请求与响应信息,并对这些信息过滤。浏览器过滤器目标资源Web容器请求响应
  • 3. 当Web容器接收到一个对资源的请求时,它将判断是否有过滤器与这个资源关联。 如果有,容器把请求交给过滤器处理。在过滤器中,可以改变请求内容,或者重新设置请求的信息,然后再将请求发送给目标资源。 当目标资源对请求做出响应后,容器同样将响应先转发给过滤器,过滤器可以对响应的内容进行转换,然后再将响应发送到客户端。过滤器对客户端和目标资源来说是透明的
  • 4. 在一个Web应用中,可以部署多个过滤器,组成一个过滤器链。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到目标资源。浏览器目标资源Web容器请求响应过滤器(1)过滤器(2)过滤器(n)
  • 5. 说明:Filter不是一个标准的Servlet,不能处理用户请求,也不能对客户端生成响应。主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。
  • 6. Filter的作用: 在HttpServletRequest到达Servlet之前,拦截客户的 HttpServletRequest 。 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。典型应用: 对用户请求进行统一认证; 对用户发送的数据进行过滤或替换; 对内容进行压缩,以减小通信量。
  • 7. 2. Filter APIFilter接口:开发过滤器要实现该接口。 主要方法: public void init(FilterConfig filterConfig) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实现过滤器的功能。在特定的操作完成后,可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),可以直接向客户端返回响应信息,或利用转发、重定向将请求转发到其他资源。 public void destroy()
  • 8. 过滤器链的工作流程
  • 9. FilterConfig接口:用于在过滤器初始化时向其传递信息。 主要方法: public String getFilterName() public ServletContext getServletContext() public String getInitParameter(String name) public Enumeration getInitParameterNames()
  • 10. FilterChain接口:该接口由容器实现,容器将其作为参数传入到过滤器对象的doFilter方法中。过滤器对象使用FilterChain对象调用过滤链中的下一个过滤器,如果该过滤器是链中的最后一个过滤器,则调用目标资源。 public void doFilter(ServletRequest request, ServletResponse response)
  • 11. 3. 过滤器的部署实现一个过滤器后,需要在web.xml中对过滤器进行配置。 通过元素完成。filter*init-paramfilter-classfilter-name*icon*display-name*description*descriptionparam-nameparam-value
  • 12. GuestbookFilter ch16.filter.GuestbookFilter word_file /WEB-INF/word.txt Servlet容器对描述符中的每一个过滤器,只创建一个实例。filter-mappingfilter-nameurl-pattern0..4 dispatcherservlet-nameor例1用户访问url-pattern指定的URL资源或servlet-name指定的servlet时,过滤器被调用。
  • 13. 元素可以包含0到4个元素,它指定过滤器对应的请求方式,可以是REQUEST、INCLUDE、FORWARD、ERROR四种之一。默认是REQUEST。 REQUEST:用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include或forward方法访问时,该过滤器不会被调用。 INCLUDE:目标资源是通过RequestDispatcher的include访问时,该过滤器将被调用。 FORWARD:目标资源是通过RequestDispatcher的forward方法调用时,过滤器将被调用。 ERROR:目标资源是通过声明式异常处理机制调用时,过滤器将被调用。
  • 14. GuestbookFilter /process.jsp 用户访问process.jsp时,容器调用GuestbookFilter过滤器。 GuestbookFilter /index.jsp REQUEST FORWARD 例1用户直接访问index.jsp,或通过RequstDispatcher的forward 方法调用时,容器将调用GuestbookFilter过滤器。例2
  • 15. 4. 过滤器开发实例实例1:LogFilter(项目:web_filter) 功能:输出日志 实例2: EncodingFilter(项目:web_filter) 功能:统一处理POST的中文