Java过滤器Filter的使用详解

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Java过滤器Filter的使用详解

来源:nnngu
cnblogs.com/nnngu/p/8626320.html

公众号注:文末阅读原文可直达java开发学习网站

过滤器

过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

如下图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

Java过滤器Filter的使用详解

过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码的重用,不必每个servlet中还要进行相应的操作。

过滤器的简单应用

1、新建一个class,实现接口Filter(注意:是javax.servlet中的Filter)。

2、重写过滤器的doFilter(request,response,chain)方法。另外两个init()、destroy()方法一般不需要重写。在doFilter方法中进行过滤操作。

3、在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器过滤器servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。


filter  
    filter-nameloginFilter/filter-name//过滤器名称  
    filter-classcom.nnngu.filter.loginFilter/filter-class//过滤器类的包路径
    init—param //可选 
        param—name参数名/param-name//过滤器初始化参数
        param-value参数值/param-value  
    /init—pamm  
/filter 
 
filter-mapping//过滤器映射  
    filter-nameloginFilter/filter-name  
    url—pattern指定过滤器作用的范围/url-pattern
/filter-mapping

url-pattren处定义过滤器作用的范围。一般有以下规则:

1、作用与所有web资源:url—pattern/*/url-pattern。则客户端请求访问任意资源文件时都要经过过滤器的过滤,通过则可以访问,否则不能访问。

2、作用于某一文件夹下所有文件:url—pattern/dir/*/url-pattern

3、作用于某一种类型的文件:url—pattern*.扩展名/url-pattern。比如url—pattern*.jsp/url-pattern过滤所有对jsp文件的访问请求。

4、作用于某一文件夹下某一类型文件:url—pattern/dir/*.扩展名/url-pattern

如果一个过滤器需要过滤多种文件,则可以配置多个filter-mapping,一个mapping定义一个url-pattern来定义过滤规则。如下:


filter
  filter-nameloginFilter/filter-name
  filter-classcom.nnngu.filter.loginFilter/filter-class
/filter
filter-mapping
  filter-nameloginFilter/filter-name
  url-pattern*.jsp/url-pattern
/filter-mapping
filter-mapping
  filter-nameloginFilter/filter-name
  url-pattern*.do/url-pattern
/filter-mapping

例1:用过滤器实现登录验证,没登录则驳回访问请求并重定向到登录页面。


public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        
        HttpServletRequest request=(HttpServletRequest) arg0;
        HttpServletResponse response=(HttpServletResponse) arg1;
        HttpSession session=request.getSession();
        
        String path=request.getRequestURI();
        
        Integer uid=(Integer)session.getAttribute("userid");
        
        if(path.indexOf("/login.jsp")-1){//登录页面不过滤
            arg2.doFilter(arg0, arg1);//递交给下一个过滤器
            return;
        }
        if(path.indexOf("/register.jsp")-1){//注册页面不过滤
            arg2.doFilter(request, response);
            return;
        }
        
        if(uid!=null){//已经登录
            arg2.doFilter(request, response);//放行,递交给下一个过滤器
            
        }else{
            response.sendRedirect("login.jsp");
        }

}

例2:设置字符编码


public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
          HttpServletRequest request2=(HttpServletRequest) request;
          HttpServletResponse response2=(HttpServletResponse) response;
          
          request2.setCharacterEncoding("UTF-8");  
          response2.setCharacterEncoding("UTF-8"); 
          
          chain.doFilter(request, response); 

    }
Java过滤器Filter的使用详解
本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Java过滤器Filter的使用详解


 上一篇
Java Web现代化开发——Spring Boot + Mybatis + Redis二级缓存 Java Web现代化开发——Spring Boot + Mybatis + Redis二级缓存
背景Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Redis是当今十分主流的分布式key-value型数据库,在web开发中,我们常
2021-04-05
下一篇 
MyBatis拦截器原理探究 MyBatis拦截器原理探究
作者:Format链接:ww.cnblogs.com/fangjian0423 公众号注:更多mybatis文章,点击文末阅读原文直达。 MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插
2021-04-05