标签:filter get 提取 chain param 技术 spec 设置 相关
通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。
//设置filter 的配置对象;
void setFilterConfig(FilterConfig config)
//返回filter的配置对象;
FilterConfig getFilterConfig()
//执行filter的工作
void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)
//配置拦截路径
@WebFilter("/*")
Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。
<filter>
<!-- 过滤器名称 -->
<filter-name>hello_filter</filter-name>
<!-- 过滤器对应的实现类 -->
<filter-class>cn.itcast.a_filter_hello.HelloFilter</filter-class>
<!-- 过滤器初始化参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>path</param-name>
<param-value>c:/...</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hello_filter</filter-name>
<!-- 过滤器过滤模式,/* 表示过滤所有资源 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
--------------------------------------------------------------------------------------------
<filter>
<!-- 过滤器名称 -->
<filter-name>hello_filter</filter-name>
<!-- 过滤器对应的实现类 -->
<filter-class>cn.itcast.a_filter_hello.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hello_filter</filter-name>
<!-- 过滤器过滤模式,/* 表示过滤所有资源 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
@WebFilter(filterName = "Filterewrt",urlPatterns = {"/"})
public class Filterewrt implements Filter {
}
和Servlet一样,Filter的创建和销毁也是由WEB服务器负责。
与Servlet区别的是
1>在应用启动的时候就进行装载Filter类而servlet是在请求时才创建(但filter与Servlet的load-on-startup配置效果相同)。
2>容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。
3>当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。
4>当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁
对于filter的应用相信大家已经明白了,它主要的作用就是用户在访问某个目标资源之前,对访问的请求和响应进行拦截,做一些处理,然后再调用目标程序,这样做的好处是可以对一些公共的操作进行抽象,就拿设置字符集来说,如果不使用这种方式,我们每个页面都要写设置字符集的语句。不但麻烦而且维护困难,但是如果使用filter的话,只需要添加一个类,在xml中配置一下,如果不想使用了,将配置文件中的内容去除即可。
其实这就是一种AOP(Aspect OrientedProgramming),面向切面编程。它的主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
对于设置字符集来说,它并非是业务逻辑的内容,对于这些内容的处理我们就可以提取出来,使用filter进行整体设置,这种方式相当于对类中的内容做进一步的抽象,使我们的系统更加灵活,更加能应对变化!
标签:filter get 提取 chain param 技术 spec 设置 相关
原文地址:https://www.cnblogs.com/jsxz/p/14862764.html