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

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

    过滤器相关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)  ;  执行下一个过滤器或放行
    /**
     * 过滤器,测试
     * @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 = 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. 销毁过滤器实例");
        }
    
    }

    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、数据库编码一致!
  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/linst/p/5874613.html
Copyright © 2011-2022 走看看