Filter,一种aop编程思想的体现
一、filter简介
filter是Servlet规范里的一个高级特性,只用于对request、response的进行修改。
filter提出了FilterChain的概念,客户端请求request在抵达servlet之前都会经过filterChain里的所有fiter,如图所示:

二、filter的生命周期
在web.xml中配置filter,当启动服务器时会实例化,并且会初始化,当有网络请求时会进行过滤操作,当 服务器关闭时,会进行销毁,全过程如下图所示:

三、编写第一个filter
filter类需实现fiter接口,需复写里面的三个方法,其中init(),在初始化时调用;doFiler()方法每次都会调用,在这个方法中一定要执行chain.doFilter(),否则request不会交给后面的filter或者servler;ondestroy()在关闭服务器时调用。
public class FirstFilter implements Filter {
@Override
public void destroy() {
System.out.println("destroy---FirstFilter");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("start----doFilter--FirstFilter");
chain.doFilter(request, response);
System.out.println("end------doFilter--FirstFilter");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init----FirstFilter");
}
配置filter:
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.forezp.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
其中,url_pattern可以配置多个,也可以用通配符,当访问满足路径匹配,并且符合dispatcher时,request会被filter拦截进行处理,处理完后的response再次被filter拦截,可以进行处理。
其中dispatcher 默认REQUEST,四种不同的dispatcher:
- REQUEST:请求时有效
- FORWARD:当某servlet通过forward到该servlet才有效
- INCLUDE: jsp通过< jsp: incluser/> 请求servlet有效
- ERROR: < %@page errorPage="" % >有效
四、防盗链
filter的特性使它可以处理特殊的工作,例如防盗链,字符编码的处理,日志记录,数据加密,过滤一些黑词等等。
例如: 防盗链图片,当其他网站请求本网站图片资源时显示错误的图片,只有本应用先生的图片才显示正确的图片,代码如下:
public class ImageFilter implements Filter{
public void init(FilterConfig config) throws Exception(){
}
public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)throws Exception{
HttpServletRequest request=(HttpServletRequest )req;
HttpServletResponse response=(HttpServletResponse)res;
String referer=request.getHeader("referer");
if(referer==null||!referer.contains(request.getServerName())){
request.getRequestDispatcher("/error.png").forwar(request,response);
}else{
chain.doFilter(request,response);
}
}
public void destroy(){}
}
在web.xml中配置:
<filter>
<filter-name>imageFilter</filter-name>
<filter-class>com.forezp.ImageFilter </filter-class>
</filter>
<filter-mapping>
<filter-name>imageFilter</filter-name>
<url-pattern> /images/* </url-pattern>
</filter-mapping>
当访问images下的所有图片会经过该filter,根据访问头信息,如果说本站点的访问则显示正确图片,否则先生错误图片。
五、字符编码
直接上代码:
public class CharsetFilter implements Filter{
private String characterEncoding;
private String enabled;
public void init(FilterConfig config) throws Exception(){
characterEncoding=config.getInitParameter("characterEncoding");
enabled=config.getInitParameter("enabled").equals("true");
}
public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)throws Exception{
if(enabled|| characterEncoding!=null){
req.setCharacterEncoding(characterEncoding);
res.setCharacterEncoding(characterEncoding);
}
chain.doFilter(req,res);
}
public void destroy(){
characterEncoding=null;
}
}
在web.xml中配置:
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>com.forezp.CharsetFilter </filter-class>
<init-param>
<param-name>characterEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>enabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中页面编码方式也必须一致,希望全部用utf-8,另外需要配置Tomcat的/config/server.xml编码:
<Connector port="8080" protocal="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
另外,还有比较常见的日志记录filter、异常捕捉filter、权限校验、内容替换filter等等。
filter有很大的弹性机制,功能强大,而且跟servlet、jsp没耦合.filter是现在面向切面编程aop的一种思想体现,它能够胜任很多工作。
2.5的fiter需要在web.xml中配置,执行顺序按照配置顺序,另外3.0可以用注解的方式配置filter,此时没有配置的顺序。
扫码关注公众号有惊喜
(转载本站文章请注明作者和出处 方志朋的博客)
Filter,一种aop编程思想的体现的更多相关文章
- 二)Spring AOP编程思想与动态代理
一.aop编程思想 1.面向切面,就是能够不动源码的情况下,从横切面切入新的代码功能. 2.实现原理是动态代理 动态代理的步骤 a.写生产厂家,实现接口,代理只能代理接口 b.动态代理类实现Invoc ...
- iOS AOP编程思想及实践
什么是 AOP Wikipedia 上的 AOP 定义: In computing, aspect-oriented programming (AOP) is a programming paradi ...
- PHP AOP编程思想
AOP思想(面向切面编程) 在应用开发中,我们经常发现需要很多功能,这些功能需要经常被分散在代码中的多个点上,但是这些点事实上跟实际业务没有任何关联.比如,在执行一些特殊任务之前需要确保用户是在登陆状 ...
- Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较
本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- spring学习总结二-----面向切面编程(AOP)思想
上一篇spring博客简总结了spring控制反转和依赖注入的相关思想知识点,这篇博文对spring的面向切的编程思想进行简单的梳理和总结. 一.面向切面的思想 与面向对象的纵向关系概念不同,面向切面 ...
- 论AOP面向切面编程思想
原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...
- 第一节: Timer的定时任务的复习、Quartz.Net的入门使用、Aop思想的体现
一. 前奏-Timer类实现定时任务 在没有引入第三方开源的定时调度框架之前,我们处理一些简单的定时任务同时都是使用Timer类, DotNet中的Timer类有三个,分别位于不同的命名空间下,分别是 ...
- 什么是AOP面向切面编程思想
一.什么是AOP? 1.AOP不是一种语言,是一种编程范式 常见的编程范式: 面向过程.面向对象.函数式编程.事件驱动编程等 2.AOP可以解决特定问题,不能解决所有问题. 3.是面向对象的补充,不是 ...
随机推荐
- Abbott's Revenge UVA - 816 (输出bfs路径)
题目链接:https://vjudge.net/problem/UVA-816 题目大意: 有一个最多包含9*9 个交叉点的迷宫.输入起点,离开起点时的朝向和终点,求一条最短路(多解时任意输出 一个即 ...
- SSM-@Transactional 注释不生效
1.在applicationConext.xml 中配置事务注解驱动 <!-- 事务注解驱动 --> <tx:annotation-driven /> <!-- 配置事务 ...
- nginx 访问路径配置
比如: http://127.0.0.1/ 对应的物理路径 c:/a/b/c 比如:http://127.0.0.1/eec 访问的地址对应的物理路径: d:/a/b/c #user nobody; ...
- netbeans 窗体字体大小设置
当计算机分辨率变大的时候,打开netbeans的时候,字体就会变得越来越小 看起来很不爽,所要就要改变一下,窗体字体大小. 在网上找到了一段修改netbeans窗体字体大小的配置信息,现标记起来,以便 ...
- attr()与setAttribute()的区别
先看红色标注的: 这里传过来的this是个元素节点,因此currentTr也得用获取节点的方式parentNode去获取,而不能写parent(),这是第一个需要注意的地方. 第二个问题,就是怎么给c ...
- 基于JQUERY 的图片查看插件
viewer是一款功能强大的图片查看器.它可以实现ACDsee等看图软件的部分功能.它可以对图片进行移动,缩放,旋转,翻转,可以前后浏览一组图片.该图片查看器还支持移动设备,支持键盘控制,功能十分强大 ...
- 权限修饰符(public、protected、default、private)权限验证
一.测试方法 在authorityTest包中建类AuthorityValidate package authorityTest; public class AuthorityValidate { p ...
- RN的打包
1.首先执行以下命令 在android目录下 keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -key ...
- Developer - 如何自我保证Node.js模块质量
组里正在做SaaS产品,其中一些模块(Module)是Node.js实现,这里我们主要使用Node.js实现Web Server来提供服务. 在做SaaS项目之前,组里的开发模式是传统的Deverlo ...
- Python爬虫教程——入门五之URLError异常处理
大家好,本节在这里主要说的是URLError还有HTTPError,以及对它们的一些处理. 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的 ...