欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java-过滤器(Filter)

程序员文章站 2022-04-09 09:41:07
在javaweb开发中,项目中都会包含一些过滤器(Filter),主要用于web服务器对资源的管理控制,如静态资源文件、jsp页面访问等。我们可以使用过滤器实现一些特殊的功能,如常见的过滤敏感词汇(替换为**)、url访问权限、登录验证,本文以登录验证为例,后面会为小伙伴们贴上代码。 开发Filte ......

javaweb开发中,项目中都会包含一些过滤器(filter),主要用于web服务器对资源的管理控制,如静态资源文件、jsp页面访问等。我们可以使用过滤器实现一些特殊的功能,如常见的过滤敏感词汇(替换为**)url访问权限、登录验证,本文以登录验证为例,后面会为小伙伴们贴上代码。

开发filter主要分为两个步骤

  1. web.xml中配置过滤器。
     <!-- 登录验证过滤器 -->
        <filter>
            <filter-name>loginfilter</filter-name><!--定义过滤器名称-->
            <filter-class>com.lzq.myproject.filter.loginfilter</filter-class><!--指定过滤器:web可通过反射进行创建并初始化-->
            <init-param><!--指定初始化参数:可以存在多个-->
                <param-name>param1</param-name><!--定义初始化参数名称-->
                <param-value>我是初始化参数</param-value><!--定义初始化参数值-->
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>loginfilter</filter-name>
            <url-pattern>/*</url-pattern><!--过滤所有url-->
        </filter-mapping>
  2. 通过实现filter接口创建过滤器。
    import javax.servlet.*;
    import javax.servlet.http.httpservletrequest;
    import javax.servlet.http.httpservletresponse;
    import javax.servlet.http.httpsession;
    import java.io.ioexception;
    
    public class loginfilter implements filter {
        private filterconfig filterconfig;
    
        @override
        public void init(filterconfig filterconfig) throws servletexception {
            // 初始化
            this.filterconfig = filterconfig;
        }
    
        @override
        public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {
            httpservletrequest request = (httpservletrequest) servletrequest;
            httpservletresponse response = (httpservletresponse) servletresponse;
            httpsession session = request.getsession();
            // 获取初始化参数 param1 的值
            string param1 = this.filterconfig.getinitparameter("param1");
            // 打印初始化参数值
            system.out.println(param1);
    
            string path = request.getrequesturi();
            if(path.indexof("/index/indexaction.do") > -1){// 登录页面不过滤
                filterchain.dofilter(request, response);// 递交给下一个过滤器
            }
            if(path.indexof("/index/indexaction!login.do") > -1){// 登录页面登录请求不过滤
                filterchain.dofilter(request, response);// 递交给下一个过滤器
            }
            if(path.indexof("/register.jsp")>-1){// 注册页面不过滤
                filterchain.dofilter(request, response);// 递交给下一个过滤器
            }
            integer uid = (integer)session.getattribute("userid");
            if(uid != null){//已经登录
                filterchain.dofilter(request, response);//放行,递交给下一个过滤器
            }else if(path.indexof("myproject") > -1){
                // 未登录,进入登录页面
                response.sendredirect("index/login.jsp");
            }
        }
    
        @override
        public void destroy() {
             // web服务器停止时,自动调用该方法进行销毁
        }
    }

  过滤器(filter)会在请求到达servlet之前,拦截用户的请求,当用户请求资源满足我们自定义条件后,进行放行。

 

  过滤器生命周期:

 

  1、filter的创建和销毁由web服务器负责。在web服务器启动时,通过web.xml读取,创建filter实例对象,并调用其实现filter接口方法init(filterconfig filterconfig)进行初始化,如果在web.xml中的<filter></filter>下存在

 

      <filter-param>

 

        <param-name>参数名</param-name>

 

        <param-value>参数值</param-value>

 

      </filter-param>

 

  标签,将把过滤器指定的初始化参数传入init方法的filterconfig对象中。filter对象只会创建一次,从而init方法也只会执行一次

 

  filterconfig接口:

string getfiltername();//得到filter的名称。 
string getinitparameter(string name);//返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.     
enumeration getinitparameternames();//返回过滤器的所有初始化参数的名字的枚举集合。 servletcontext getservletcontext();//返回servlet上下文对象的引用。

 

  2、当用户请求访问与过滤器关联的url时,将执行dofilter(servletrequest request,servletresponse response, filterchain chain)方法。该方法的形参filterchain将请求交给下一个过滤器。

  3、web服务器停止时,过滤器将自动被销毁,调用过滤器对应的destroy方法。方法destroy也只会执行一次

 

 

filter链:web项目中,我们将web.xml中配置的多个过滤器组合称为一个filter链,过滤器的调用顺序为web.xml中配置注册的顺序,通过dofilter方法的filterchain对象可移交到下一个过滤器。