1.6
思路:servlet过滤器filter。主要过滤请求和相应(可以设置)
a.应用实例:1.登录拦截验证2.编码格式设定3.过滤不雅字(装饰模式)4.设置无缓存
Servlet 过滤器:拦截重定向,然后拦截返回的转发
Filter接口:用来实现过滤器
获取上下文路径:${pageContext.request.contextPath}
生命周期: init 初始化 doFilter
执行 destroy销毁
先执行构造方法,再执行初始化方法(该方法由servlet容器调用)
过滤器的使用:
1.
注册过滤器
<filter>
<!--注册的过滤器的名称-->
<filter-name>BaseFilter</filter-name>
<!-- 配置过滤器的完成路径
-->
<filter-class>com.itcast.filter.BaseFilter</filter-class>
</filter>
2.
配置过滤器的映射,即要拦截的文件类型
<!-- 配置过滤器的映射 -->
<filter-mapping>
<!-- 以注册的过滤器的名称
-->
<filter-name>BaseFilter</filter-name>
<!-- 拦截所有的文件
-->
<url-pattern>/*</url-pattern>
</filter-mapping>
Init中的FilterConfig接口的应用:
该接口类似于ServletConfig接口,由容器实现。Servlet规范将代表 ServletContext 对象和
Filter 的配置参数信息都封装在该对象中。Servlet 容器将其作为参数传入过滤器对象的init()方法中。
l
String getFilterName():得到描述符中指定的过滤器的名字。
l
String getInitParameter(String name):
返回在部署描述中指定的名字为name的初始化参数的值。如果不存在返回null.
l
Enumeration
getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
l
public ServletContext getServletContext():返回Servlet上下文对象的引用。
Filter 接口
l
doFilter(ServletRequest request,ServletResponse response,
FilterChain chain)throws java.io.IOException,ServletException:
doFilter()方法类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。
* 其中参数 request, response 为 web 容器或 Filter 链的上一个
Filter 传递过来的请求和相应对象;
* 参数 chain 为代表当前 Filter
链的对象,在特定的操作完成后,可以在当前 Filter 对象的 doFilter 方法内部需要调用 FilterChain 对象的
chain.doFilter(request,response)方法才能把请求交付给
* Filter 链中的下一个 Filter
* 或者目标 Servlet 程序去处理,
* 也可以直接向客户端返回响应信息,
* 或者利用RequestDispatcher的forward()和include()方法,
以及HttpServletResponse的sendRedirect()方法将请求转向到其他资源
这个方法的请求和响应参数的类型是ServletRequest和ServletResponse,也就是
说,过滤器的使用并不依赖于具体的协议。
FilterChain接口
l
FilterChain接口:代表当前 Filter
链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中{zh1}一个过滤器,那么将调用目标资源。
l
doFilter(ServletRequest request,ServletResponse response)throws
java.io.IOException:调用该方法将使过滤器链中的下一个过滤器被调用。如果是{zh1}一个过滤器,会调用目标资源。
Filter的应用:设置程序全局编码格式
再filter中强转servletRequest为httpServletRequest然后设置编码格式
优化:将要设置的编码格式配置在filter的初始化参数中,然后用FilterConfig获取参数,并设置.(回忆:获取web.xml的初始化参数:request.getServletConfig)
拦截单个或指定的多个拦截:
<filter-mapping>
//可以设定多个filter-mapping
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 只拦截一个servlet
-->
<servlet-name>EmpServlet</servlet-name>
<!-- 拦截所有文件
-->
<!--
<url-pattern>/*</url-pattern>
-->
</filter-mapping>
拦截servlet方法
<!-- 拦截所有的*.do文件
-->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
问题:无法拦截转发的请求
映射 Filter
l
<filter-mapping>元素用于设置一个 Filter
所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径( url样式)
•
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
•
<url-pattern>设置 filter
所拦截的请求路径(过滤器关联的URL样式)
•
<servlet-name>指定过滤器所拦截的Servlet名称。
•
<dispatcher>指定过滤器所拦截的资源被
Servlet
容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST.
可以设置多个<dispatcher>
子元素用来指定 Filter 对资源的多种调用方式进行拦截
<dispatcher> 子元素可以设置的值及其意义:
•
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
•
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
•
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
•
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
实例:
<filter-mapping>
<filter-name>NoteFilter</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
获取初始filter中设置的参数:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.itcast.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
获取:
filterConfig.getInitParameter("encoding");
//调用用filterConfi接口的方法
回忆:获取初始化参数和servlet构造参数
<context-param>
<param-name>driver_type</param-name>
<param-value>
oracle.jdbc.driver.OracleDriver
</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<paramvalue>
jdbc:oracle:thin:@rich:1521:ora9201
</param-value>
</context-param>
List. Contains(obj); //
判断该list中是否存在指定的参数
getServletContext().getInitParameter("");
//全局参数获取
getServletConfig().getInitParameter("name");
//单个servlet初始化参数
过滤指定的文件:
filtermapping里面定义了对文件进行过滤,
1)、”/*”表示所有URL
2)、如果*.jsp表示对后缀是.jsp的文件进行过滤
3)、如果还有其他的页面,如.do或者.action等,那么可以继续添加
<filter-mapping>这个选项,其中<url-pattern>就填写*.do或者*.action即可。
过滤器链
若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web
容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter
的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致
HttpServletReuqest.getSession();
装饰模式:
l
装饰 HttpServletRequest 对象
:HttpServletRequestWrapper 类
l
Servlet API
中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象,
HttpServletRequestWrapper 类实现了 HttpServletRequest
接口中的所有方法,这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法
l
相类似 Servlet API 也提供了一个 HttpServletResponseWrapper 类来包装原始的 response
对象