首页 > 代码库 > 过滤器

过滤器

 

过滤器,设计执行流程:1.    用户访问服务器2.    过滤器: 对Servlet请求进行拦截3.    先进入过滤器, 过滤器处理4.    过滤器处理完后, 在放行, 此时,请求到达Servlet/JSP5.    Servlet处理6.    Servlet处理完后,再回到过滤器, 最后在由tomcat服务器相应用户;

过滤器相关Api
|-- interface  Filter                过滤器核心接口    Void  init(filterConfig);    初始化方法,在服务器启动时候执行Void  doFilter(request,response,filterChain);   过滤器拦截的业务处理方法Void destroy();               销毁过滤器实例时候调用|-- interface  FilterConfig   获取初始化参数信息    StringgetInitParameter(java.lang.String name) EnumerationgetInitParameterNames() |-- interface  FilterChain     过滤器链参数;一个个过滤器形成一个执行链;    void doFilter(ServletRequest request, ServletResponse response)  ;  执行下一个过滤器或放行

 

/** * 过滤器,测试 * @author  * */public class HelloFilter implements Filter{        // 创建实例    public HelloFilter(){        System.out.println("1. 创建过滤器实例");    }    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("2. 执行过滤器初始化方法");                // 获取过滤器在web.xml中配置的初始化参数        String encoding = filterConfig.getInitParameter("encoding");        System.out.println(encoding);                // 获取过滤器在web.xml中配置的初始化参数 的名称        Enumeration<String> enums =  filterConfig.getInitParameterNames();        while (enums.hasMoreElements()){            // 获取所有参数名称:encoding、path            String name = enums.nextElement();            // 获取名称对应的值            String value =http://www.mamicode.com/ filterConfig.getInitParameter(name);            System.out.println(name + "\t" + value);        }    }    // 过滤器业务处理方法: 在请求到达servlet之前先进入此方法处理公用的业务逻辑操作    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        System.out.println("3. 执行过滤器业务处理方法");        // 放行 (去到Servlet)        // 如果有下一个过滤器,进入下一个过滤器,否则就执行访问servlet        chain.doFilter(request, response);                System.out.println("5. Servlet处理完成,又回到过滤器");    }    @Override    public void destroy() {        System.out.println("6. 销毁过滤器实例");    }}

 

xml配置

<!-- 过滤器配置 -->    <filter>        <!-- 配置初始化参数 -->        <init-param>            <param-name>encoding</param-name>            <param-value>UTF-8</param-value>        </init-param>        <init-param>            <param-name>path</param-name>            <param-value>c:/...</param-value>        </init-param>            <!-- 内部名称 -->        <filter-name>hello_filter</filter-name>        <!-- 过滤器类的全名 -->        <filter-class>cn.itcast.a_filter_hello.HelloFilter</filter-class>    </filter>    <filter-mapping>        <!-- filter内部名称 -->        <filter-name>hello_filter</filter-name>        <!-- 拦截所有资源 -->        <url-pattern>/*</url-pattern>    </filter-mapping>

 

对指定的请求拦截

/*   表示拦截所有的请求<filter-mapping>        <filter-name>hello_filter2</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

 

默认拦截的类型:(直接访问或者重定向)<dispatcher>REQUEST</dispatcher>拦截转发:          <dispatcher>FORWARD</dispatcher>拦截包含的页面(RequestDispatcher.include(/page.jsp);    对page.jsp也执行拦截)          <dispatcher>INCLUDE</dispatcher>拦截声明式异常信息:          <dispatcher>ERROR</dispatcher>

 

<!-- 配置第二个过滤器 -->    <!-- 演示: 拦截指定的请求 -->    <filter>        <filter-name>hello_filter2</filter-name>        <filter-class>cn.itcast.a_filter_hello.HelloFilter2</filter-class>    </filter>    <filter-mapping>        <filter-name>hello_filter2</filter-name>        <!-- 1. 拦截所有        <url-pattern>/*</url-pattern>         -->                  <!-- 2. 拦截指定的jsp          <url-pattern>/index.jsp</url-pattern>         <url-pattern>/list.jsp</url-pattern>         -->         <!-- 拦截所有的jsp         <url-pattern>*.jsp</url-pattern>          -->          <!-- 3. 根据servlet的内部名称拦截          <servlet-name>IndexServlet</servlet-name>           -->          <!-- 拦截指定的servlet           <url-pattern>/index</url-pattern>          -->                    <!-- 4. 指定拦截指定的类型 -->          <url-pattern>/*</url-pattern>          <dispatcher>REQUEST</dispatcher>          <dispatcher>FORWARD</dispatcher>    </filter-mapping>

 

共性问题

共性问题:1.    过滤器:方法参数没有自动命名,说明没有关联源码-- 关联tomcat或servlet源代码    2. 连接池: 多刷新几次,报错!        - 连接没关            QueryRunner qr = new QueryRunner();            qr.update(con,sql);            // 这里con一定要关闭        - 注意:dataSource 确定一个项目创建一次            QueryRunner qr = new QueryRunner(dataSource);         修改连接池参数配置    3 .  编码        // 设置POST提交的请求的编码        request.setCharacterEncoding("UTF-8");        // 设置相应体的编码        response.setCharacterEncoding("UTF-8");        // 设置页面打开时候时候的编码格式、 设置相应体的编码        response.setContentType("text/html;charset=UTF-8");        开发中:            工作区间编码、项目编码、request/response、数据库编码一致!

 

过滤器