一、过滤器
1.1概述
Servlet的技术规范中,定义了Servlet、Filter(过滤器)、Listener(监听器)三门技术。
过滤器也被称为拦截器。
过滤器(拦截器)可以拦截对资源的访问,一个资源可以被多个过滤器所拦截;一个过滤器
又可以拦截多个资源。拦截下来后可以控制是否允许访问(权限控制)、在访问资源之前或之后做一些
操作(比如:事务管理、乱码处理、禁止jsp页面缓存等等)
1.2过滤器的开发
开发步骤:
1、创建一个类实现Filter接口,实现对应的方法
2、在web.xml文件中进行配置。
具体实现:
1、编写一个类实现Filter接口
~~Filter的声明周期:
当服务器启动,web应用加载后立即创建出当前web项目的所有过滤器对象,创建出来后会立即调用
init方法进行初始化。从此这些对象就驻留在了内存中,为后续对服务器的请求进行拦截,每次拦截到
对资源的访问都会调用doFilter方法,直到服务器关闭或web应用移除出容器时,随着该web应用的销
毁其中的过滤器对象也随之销毁,在销毁之前调用destory方法进行善后操作。
init(FilterConfig config)在过滤器初始化时调用
FilterConfig config:代表当前Filter在web.xml文件中的配置信息
可以获取过滤器的初始化参数。
String val = filterConfig.getInitParameter("name2");
Enumeration<String> enums = filterConfig.getInitParameterNames();
可以获取代表当前web应用ServletContext对象(application)
ServletContext sc = filterConfig.getServletContext();
doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)符合该过滤器拦截条件的请求时调用该方法。
FilterChain:过滤器链
一个web资源可以被多个过滤器所拦截,过滤器的顺序和Filter在web.xml文件的
配置顺序(<filter-mapping>)相同。先配置的先执行。
这些过滤器按照拦截的顺利组成了一个拦截器链,用FilterChain类对象代表,如果
当一个过滤器执行过后,还想执行后续的过滤器,则需要调用FilterChain的doFilter(request,response)方法,
表示放行可以去执行过滤器链的下一个节点,如果下一个节点仍然是过滤器则接着过滤,如果下一个
节点是被访问的资源,则直接执行访问的资源。
destory()过滤器销毁时调用,做善后的操作
2、在web应用的web.xml文件中配置过滤器
<!-- 配置一个过滤器 -->
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>cn.tedu.filter.FirstFilter</filter-class>
<init-param><!-- 配置一个初始化参数 -->
<param-name>name1</param-name><!-- 初始化参数的名称 -->
<param-value>value1</param-value><!-- 初始化参数的值-->
</init-param>
<init-param>
<param-name>name2</param-name>
<param-value>value2</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<!-- 要拦截的路径,路径的写法和servlet路径配置的方式一致,可以配置多个 -->
<url-pattern>/*</url-pattern>
<!--<servlet-name></servlet-name> 拦截指定的servlet -->
<!-- dispatcher拦截方式:
REQUEST:代表请求(缺省值)
ERROR:代表出错
FORWARD:代表服务器转发
INCLUDE:代表包含时。
如果该配置没有指定,则默认拦截REQUEST类型。
-->
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
1.3Filter的重要应用
1、全站的中文乱码的处理
想要改变不喜欢的方法
继承
不能修改已有对象身上方法。
装饰者模式
可以修改已有对象身上方法。
动态代理(以后再讲)
String getParameter(String name)
Map getParameterMap()
Enumeration getParameterValues()
开发步骤1:
创建类EncoderFilter类实现Filter接口
步骤2:
在web.xml文件中进行配置。
步骤3:
在实现类EncoderFilter实现接口中的抽象方法
1.1概述
Servlet的技术规范中,定义了Servlet、Filter(过滤器)、Listener(监听器)三门技术。
过滤器也被称为拦截器。
过滤器(拦截器)可以拦截对资源的访问,一个资源可以被多个过滤器所拦截;一个过滤器
又可以拦截多个资源。拦截下来后可以控制是否允许访问(权限控制)、在访问资源之前或之后做一些
操作(比如:事务管理、乱码处理、禁止jsp页面缓存等等)
1.2过滤器的开发
开发步骤:
1、创建一个类实现Filter接口,实现对应的方法
2、在web.xml文件中进行配置。
具体实现:
1、编写一个类实现Filter接口
~~Filter的声明周期:
当服务器启动,web应用加载后立即创建出当前web项目的所有过滤器对象,创建出来后会立即调用
init方法进行初始化。从此这些对象就驻留在了内存中,为后续对服务器的请求进行拦截,每次拦截到
对资源的访问都会调用doFilter方法,直到服务器关闭或web应用移除出容器时,随着该web应用的销
毁其中的过滤器对象也随之销毁,在销毁之前调用destory方法进行善后操作。
init(FilterConfig config)在过滤器初始化时调用
FilterConfig config:代表当前Filter在web.xml文件中的配置信息
可以获取过滤器的初始化参数。
String val = filterConfig.getInitParameter("name2");
Enumeration<String> enums = filterConfig.getInitParameterNames();
可以获取代表当前web应用ServletContext对象(application)
ServletContext sc = filterConfig.getServletContext();
doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)符合该过滤器拦截条件的请求时调用该方法。
FilterChain:过滤器链
一个web资源可以被多个过滤器所拦截,过滤器的顺序和Filter在web.xml文件的
配置顺序(<filter-mapping>)相同。先配置的先执行。
这些过滤器按照拦截的顺利组成了一个拦截器链,用FilterChain类对象代表,如果
当一个过滤器执行过后,还想执行后续的过滤器,则需要调用FilterChain的doFilter(request,response)方法,
表示放行可以去执行过滤器链的下一个节点,如果下一个节点仍然是过滤器则接着过滤,如果下一个
节点是被访问的资源,则直接执行访问的资源。
destory()过滤器销毁时调用,做善后的操作
2、在web应用的web.xml文件中配置过滤器
<!-- 配置一个过滤器 -->
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>cn.tedu.filter.FirstFilter</filter-class>
<init-param><!-- 配置一个初始化参数 -->
<param-name>name1</param-name><!-- 初始化参数的名称 -->
<param-value>value1</param-value><!-- 初始化参数的值-->
</init-param>
<init-param>
<param-name>name2</param-name>
<param-value>value2</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<!-- 要拦截的路径,路径的写法和servlet路径配置的方式一致,可以配置多个 -->
<url-pattern>/*</url-pattern>
<!--<servlet-name></servlet-name> 拦截指定的servlet -->
<!-- dispatcher拦截方式:
REQUEST:代表请求(缺省值)
ERROR:代表出错
FORWARD:代表服务器转发
INCLUDE:代表包含时。
如果该配置没有指定,则默认拦截REQUEST类型。
-->
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
1.3Filter的重要应用
1、全站的中文乱码的处理
想要改变不喜欢的方法
继承
不能修改已有对象身上方法。
装饰者模式
可以修改已有对象身上方法。
动态代理(以后再讲)
String getParameter(String name)
Map getParameterMap()
Enumeration getParameterValues()
开发步骤1:
创建类EncoderFilter类实现Filter接口
步骤2:
在web.xml文件中进行配置。
步骤3:
在实现类EncoderFilter实现接口中的抽象方法