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中配置:

“` imageFilter com.forezp.ImageFilter

imageFilter /images/*

“` 当访问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中配置:

“` CharsetFilter com.forezp.CharsetFilter characterEncoding UTF-8 enabled true

CharsetFilter /*

“`

其中页面编码方式也必须一致,希望全部用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,此时没有配置的顺序。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

JSP开发过程遇到的中文乱码问题及解决方法

JSP开发过程遇到的中文乱码问题及解决方法 1.数据库编码不一致导致乱码 解决方法: 首先查看数据库编码,输入: show variables like "%c...

2079
来自专栏信安之路

IAT 三连之什么是 IAT?

IAT 的全称是 ImportAddress Table。在可执行文件中使用其他 DLL 可执行文件的代码或数据,称为导入或者输入,当 PE 文件载入内存时,w...

1000
来自专栏吉浦迅科技

当CUDA程序执行后没有反应.....

有一天,QQ群里有人求助,说CUDA程序执行后没有反应!! ? 不过这个问题太常见了,经常被问及到 ? 面对这个情况,让我们来说说 CUDA调试正确的打开方式!...

4307
来自专栏我的小碗汤

Log4jConfigListener动态改变记录级别及实现

摘要: 线上的系统出现了bug,可能是请求的数据出现了问题,这个时候,日志就为我们提供了解决问题的办法。但是线上的产品系统,一般的优先级都在INFO之上,如果修...

1104
来自专栏Android 研究

OKHttp源码解析(八)--中阶之连接与请求前奏

在http请求中,对于请求速度提升和降低延迟,keepalive在网络连接发挥着重大作用。

2182
来自专栏智能大石头

改进版CodeTimer及XCode性能测试

在测试XCode性能的时候,发现每次执行测试程序得到的执行时间差距实在太大,于是采用了老赵的CodeTimer来计算线程时间,后来因为测试程序稍微有点复杂,在使...

2807
来自专栏Hadoop实操

如何使用Java调用HBase的 Endpoint Coprocessor

2102
来自专栏码匠的流水账

聊聊selenium的webdriver的超时参数

selenium-api-2.53.1-sources.jar!/org/openqa/selenium/WebDriver.java

722
来自专栏开发技术

shiro源码篇 - shiro的session共享,你值得拥有

    老师对小明说:"乳就是小的意思,比如乳猪就是小猪,乳名就是小名,请你用乳字造个句"     小明:"我家很穷,只能住在40平米的乳房"     老师:"...

1954
来自专栏西安-晁州

jsp、servlet笔记

1、init    初始化Jsp&Servlet方法    destroy 销毁Jsp&Servlet之前的方法    service 对用户请求生成响应的方法...

2310

扫码关注云+社区