zoukankan      html  css  js  c++  java
  • 过滤器

    过滤器,设计执行流程:

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

    过滤器执行流程

    OOAD   面向对象的分析与设计

    使用RationRose 时序图

    过滤器相关Api

    |-- interface  Filter                                      过滤器核心接口

             Void  init(filterConfig);    初始化方法,在服务器启动时候执行

        Void  doFilter(request,response,filterChain);   过滤器拦截的业务处理方法

        Void destroy();                         销毁过滤器实例时候调用

    |-- interface  FilterConfig   获取初始化参数信息

            

    String

    getInitParameter(java.lang.String name)

    Enumeration

    getInitParameterNames()

    |-- interface  FilterChain     过滤器链参数;一个个过滤器形成一个执行链;

             void doFilter(ServletRequest request, ServletResponse response)  ;  执行下一个过滤器或放行


    入门案例:

    package com.loaderman.demo;
    
    import java.io.IOException;
    import java.util.Enumeration;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    /**
     * 过滤器,测试
     * @author Jie.Yuan
     *
     */
    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 = filterConfig.getInitParameter(name);
                System.out.println(name + "	" + 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. 销毁过滤器实例");
        }
    
    }
    <!-- 过滤器配置 -->
        <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>com.loaderman.HelloFilter</filter-class>
        </filter>
        <filter-mapping>
            <!-- filter内部名称 -->
            <filter-name>hello_filter</filter-name>
            <!-- 拦截所有资源 -->
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    /*   表示拦截所有的请求

    <filter-mapping>
            <filter-name>hello_filter</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>

    共性问题:

     

     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、数据库编码一致!
    
    默认拦截的类型:(直接访问或者重定向)
    <dispatcher>REQUEST</dispatcher>
    拦截转发:
                         <dispatcher>FORWARD</dispatcher>
    拦截包含的页面(RequestDispatcher.include(/page.jsp);    对page.jsp也执行拦截)
                         <dispatcher>INCLUDE</dispatcher>
    拦截声明式异常信息:
                         <dispatcher>ERROR</dispatcher>

     

     

  • 相关阅读:
    Solution: Win 10 和 Ubuntu 16.04 LTS双系统, Win 10 不能从grub启动
    在Ubuntu上如何往fcitx里添加输入法
    LaTeX 笔记---Q&A
    Hong Kong Regional Online Preliminary 2016 C. Classrooms
    Codeforces 711E ZS and The Birthday Paradox
    poj 2342 anniversary party
    poj 1088 滑雪
    poj 2479 maximum sum
    poj 2481 cows
    poj 2352 stars
  • 原文地址:https://www.cnblogs.com/loaderman/p/10019271.html
Copyright © 2011-2022 走看看