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 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

spring mvc4的日期/数字格式化、枚举转换

日期、数字格式化显示,是web开发中的常见需求,spring mvc采用XXXFormatter来处理,先看一个最基本的单元测试:

533
来自专栏小白安全

Java反序列化利用工具 -- Java Deserialization Exp Tools

Java反序列化漏洞已经被曝出一段时间了,本人参考了网上大神的放出来的工具,将Jboss、Websphere和weblogic的反序列化漏洞的利用集成到了一起...

4266
来自专栏FreeBuf

新手指南:DVWA-1.9全级别教程之SQL Injection

目前,最新的DVWA已经更新到1.9版本(点击原文查看链接),而网上的教程大多停留在旧版本,且没有针对DVWA high级别的教程,因此萌发了一个撰写新手教程的...

2648
来自专栏赵俊的Java专栏

Java 爬知乎某个问题下的所有图片

2074
来自专栏yukong的小专栏

【SpringBoot系列03】SpringBoot之使用freemark视图模板

【SpringBoot系列02】SpringBoot之使用Thymeleaf视图模板

1513
来自专栏木宛城主

Set up development environment for apps for SharePoint 2013

SharePoint 2013 support app development pattern.An app for SharePoint is small ...

1985
来自专栏闻道于事

Spring boot集成MybatisPlus

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。(摘自myba...

372
来自专栏Scott_Mr 个人专栏

RxSwift 实战操作【注册登录】

2796
来自专栏一个会写诗的程序员的博客

6.3 Spring Boot集成mongodb开发小结

本章我们通过SpringBoot集成mongodb,Java,Kotlin开发一个极简社区文章博客系统。

793
来自专栏jeremy的技术点滴

《Network Programming with Go》阅读重点备忘(二)

3195

扫码关注云+社区