如何弹簧丝,其单例模式 初始化参数数值的OncePerRequestFilter

SpringMVC 过滤器Filter使用解析
SpringMVC 过滤器Filter使用解析
SpringMVC框架是一个成熟的优秀java web开发框架,学习研究框架设计有助于我们更好的理解和掌握spring MVC,设计和写出更符合的结构和代码。
本节主要是研读SpringMVC框架中的过滤器设置,以编码处理过滤器为例来学习框架内是怎样设置过滤器的。
如上所示的spring-web.jar包结构所示, Spring的web包中中提供有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所当然地实现了javax.servlet.Filter,
不过实现的方式有以下几类:
(1) 直接实现Filter,这一类过滤器只有CompositeFilter;
(2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;
(3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter。
过滤器放在容器结构的什么位置?
过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet、一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。Filter:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
Filter 有如下几个种类:
用户授权的Filter: Filter 负责检查用户请求,根据请求过滤用户非法请求。
日志Filter: 详细记录某些特殊的用户请求。
负责解码的Filter: 包括对非标准编码的请求解码。
能改变XML 内容的XSLTFilter 等。
Filter 有如下几个用处:
在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
创建一个Filter 只需两个步骤: (1)创建Filter 处理类:
(2)在web.xml 文件中配置Filter 。
创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。 o void init(FilterConfig config): 用于完成Filter 的初始化。 o void destroy(): 用于Filter 销毁前,完成某些资源的回收。 o void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
过滤器Filter也具有生命周期:init()-&doFilter()-&destroy(),由部署文件中的filter元素驱动。
参照编码过滤器示例来查看怎么实现的
首先配置在web.xml文件里的规则如下
&!-- 编码处理过滤器 --&
&filter-name&encodingFilter&/filter-name&
&filter-class&org.springframework.web.filter.CharacterEncodingFilter&/filter-class&
&init-param&
&param-name&encoding&/param-name&
&param-value&utf-8&/param-value&
&/init-param&
&init-param&
&param-name&forceEncoding&/param-name&
&param-value&true&/param-value&
&/init-param&
&filter-mapping&
&filter-name&encodingFilter&/filter-name&
&url-pattern&*.do&/url-pattern&
&/filter-mapping&
其中,filter-class 为过滤器Filter类,init-prama为注入的set参数
Filter-mapping中的url-pattern为过滤的url类型
类的继承关系
CharacterEncodingFilter r类继承了 OncePerRequestFilter 类
public class CharacterEncodingFilter extends OncePerRequestFilter
而OncePerRequestFilter 类又继承了GenericFilterBean 类
public abstract class OncePerRequestFilter extends GenericFilterBean
public abstract class GenericFilterBean implements
Filter, BeanNameAware, EnvironmentAware, ServletContextAware, InitializingBean, DisposableBean
设置编码的核心代码为
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
request.setCharacterEncoding(this.encoding);
if (this.forceEncoding) {
response.setCharacterEncoding(this.encoding);
filterChain.doFilter(request, response);
其中filterChain为过滤器链,表示执行完这个过滤器之后接着执行下一个过滤器
我们在使用过滤器时,通常没必要知道GenericFilterBean、OncePerRequestFilter和AbstractRequestLoggingFilter,但不防碍我们了解这几个类,就上文所述,AbstractRequestLoggingFilter继承自OncePerRequestFilter,OncePerRequestFilter继承自GenericFilterBean,所以我们知道,genericFilterBean是任何类型的过滤器的一个比较方便的超类,这个类主要实现的就是从web.xml文件中取得init-param中设定的值,然后对Filter进行初始化(当然,其子类可以覆盖init方法)。
OncePerRequestFilter继承自GenericFilterBean,那么它自然知道怎么去获取配置文件中的属性及其值,所以其重点不在于取值,而在于确保在接收到一个request后,每个filter只执行一次,它的子类只需要关注Filter的具体实现即doFilterInternal。
AbstractRequestLoggingFilter是对OncePerRequestFilter的扩展,它除了遗传了其父类及祖先类的所有功能外,还在doFilterInternal中决定了在过滤之前和之后执行的事件,它的子类关注的是beforeRequest和afterRequest。
总体来说,这三个类分别执行了Filter的某部分功能,当然,具体如何执行由它们的子类规定,若你需要实现自己的过滤器,也可以根据上文所述继承你所需要的类。
SpringMVC+mybatis HTML5 全新高大尚后台框架_集成代码生成器
如果您想提高自己的技术水平,认识同行朋友、开拓技术视野,请加入QQ群:
Powered by
& 2014 &&&联系本站:濡備綍寮圭哀涓濓紝鍏跺垵濮嬪寲鍙傛暟鍊肩殑OncePerRequestFilter锛-web.xml-CodeGo.net
濡備綍寮圭哀涓濓紝鍏跺垵濮嬪寲鍙傛暟鍊肩殑OncePerRequestFilter锛
鎴戞湁涓涓畝鍗曠殑OncePerRequestFilter鏈変竴瀵瑰か濡囩殑init-param瀹氫箟鎴戠殑浣滃搧web.xml锛屼絾鎴戜笉鐭ラ亾濡備綍浠庤繃婊ゅ櫒涓闂畠浠getFilterConfig()鍥炴姤nullinit(FilterConfig)鏂囨。浣垮畠鍚捣鏉ュ儚鍩虹涓婄殑瀹冧細鍋氭敞鍏ean鐨勫睘鎬init-param锛屼緥濡傚弬鏁foo灏嗗畠鐨勫兼敞鍏ュ埌鎴垮湴浜т笂鐨勮繃婊ゅ櫒foo浣嗗湪璁板綍doFilterInternal浼间箮琛ㄦ槑锛屾儏鍐靛苟闈炲姝ゃ
鐢变簬鎴戞槸鐩稿綋鏂扮殑鐜颁唬鍖栫殑spring锛堝ぇ绾︽槸1.x鐨勫ぉ鏁帮級鍜屽叏鏂扮殑浠pring MVC鐨勶紝鎴戞暍鑲畾锛屾垜鍙槸閿欒繃浜嗭紝浣嗘垜鐪嬩笉鍑哄畠鏄粈涔堛傛劅璋㈡偍鐨勫府鍔┿
鏈枃鍦板潃 锛欳odeGo.net/5847075/
-------------------------------------------------------------------------------------------------------------------------
1.璇init-param鍊兼槧灏勫埌婊ゆ尝鍣ㄦ槸鑷殑灞炴с
public MyFilter extends OncePerRequestFilter {
// the following should be called once the `GenericFilterBean` `init` method has run
public void setFoo(String foo){
this.foo =
&init-param&
&param-name&foo&/param-name&
&param-value&bar&/param-value&
&/init-param&
鏈枃鏍囬 锛氬浣曞脊绨т笣锛屽叾鍒濆鍖栧弬鏁板肩殑OncePerRequestFilter锛
鏈枃鍦板潃 锛欳odeGo.net/5847075/
Copyright 漏 2014 CodeGo.net}

我要回帖

更多关于 初始化参数列表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信