javaweb(2.4)过滤器——Filter

  • • 发表于 8年前
  • • 作者 大妖怪
  • • 3735 人浏览
  • • 5 条评论
  • • 最后编辑时间 8年前
  • • 来自 [技 术]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

前面我们介绍过设置Servlet请求和响应的字符编码。当时的做法是这样:

直接在当前Servlet接口上HttpServletRequest或者HttpServletResponse的编码。照这么看,那么我们有多少个Servlet就得设置多少个类似的编码。项目中只有一个两个Servlet那还好说,如果项目中有几百个呢?当然,神奇的Servlet也想到了这个问题,于是它为我们提供了过滤器(Filter)这样的解决方案。
Servlet的过滤器体现了面向切面(AOP)的编程思想。那么什么是面向切面呢?我们可以把客户端和服务端之间数据传输过程比作是水管流水,这个传输的连接就是水管,HttpServletRequest和HttpServletResponse就是水管里的水,往外或者往内流,那么,我们的Filter就可以看做是把水管横着切开,然后插入一个个大小不同网来拦截水中不同的东西。

简单画了一下我们客户端和服务端数据交流的示意图。如图所示:

  • 我们的过滤器可以加任意多个
  • 过滤器主要是加在请求到达服务器之前,对请求数据进行处理
  • 过滤器本身不会影响到我们的业务逻辑,也不会插入到我们的代码当中,并且可以随需求增加减少或者修改,增加了代码的可服用小降低了项目的耦合度。
    下面我们在之前的基础上来写一个字符编码的过滤器:
    首先我们在Servlet包的平级位置上建一个Filter包,用来放Filter:

    为了方便查看,点这个小箭头

    选择Package Presentation——Hierarchical将包路径变得j简洁点:

    然后,我们在Filter下建一个类,实现javax.servlet.Filter类,然后重写类里面的三个方法:
public class EncodingFilter implements Filter {
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

和Servlet一样,Fliter也有自己的生命周期:

  • init():初始化Filter,启动时访问该方法
  • doFilter():执行Filter内的业务逻辑,每一次请求都会访问改方法
  • destroy():销毁Filter,该方法在web容器关闭之后调用,用于清理内存资源

那么,别的不多讲,有兴趣的可以像试验Servlet在每个方法内打印一下,我们现在往doFilter()内写入处理字符编码的业务逻辑:

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
    arg0.setCharacterEncoding("UTF-8");//设置请求编码

    arg1.setCharacterEncoding("UTF-8");//设置响应编码

    arg2.doFilter(arg0,arg1);//处理过的请求传回原来的连接
}

其中FilterChain这个类主要是为了实现将处理过请求传回原来的连接,相当于给请求放行。因此我们可以利用这个移动端验证登陆的过滤器,逻辑是用户登陆之后服务器返回一个登陆的key并保存在缓存或者数据库,移动端每次请求别的接口都需要在参数中驾驶证这个key,然后过滤器来验证这个key在服务端是否存在,如果不存在,就不通过。

Filter写好了,我们怎么用在Servlet上呢?配置web.xml,和Servlet的配置很像:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.dyg.Filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

写完之后如图:

这段配置和Servlet的配置很像,只不过url-pattern是配置过滤的路径,这里”/“表示过滤所有的请求,按照图中配置,如果将”/“改为”/test”则是过滤上,上面testServlet这个请求,该配置比较灵活,有可以做很多事情比如:

  • /*: 过滤所有
  • /*.jsp: 过滤某一类(如后缀是jsp)
  • /a/*: 过滤某目录下所有内容(如a下的所有内容)
  • /a.jsp: 精确过滤某一个文件(如a.jsp)
分享到:
5条评论
Ctrl+Enter
作者

大妖怪

大妖怪

APP:1 帖子:76 回复:200 积分:7517

已加入社区[2943]天

梦里巷口,可有你倚门回首

作者详情》
Top