zoukankan      html  css  js  c++  java
  • Servlet过滤器--Filter

    一、定义:

    • 是一种特殊的Servlet,可以用来对请求进行过滤,多个过滤器可以形成过滤链; 
    • 当请求发送到servlet之前,可以用过滤器截获和处理请求,在servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应。
    • 实现javax.servlet.Filter接口里面的 init,doFilter、destroy等抽象方法,是过滤器的生命周期。

          

    • 过滤器的工作原理:

    二、Web.xml中的配置声明
    • 根据servlet2.3规范,filter执行是按照 filter-mapping 先后顺序进行执行;
    • 第一段代码:声明过滤器名;第二段代码:将过滤器映射到你想过滤的web 资源 声明对应URL模式的过滤器映射
    <filter>      
             <filter-name>  文件名 </filter-name>      
             <filter-class> 包名. 文件名 </filter-class>      
             <init-param>{可选}        
                 <param-name>变量名  </param-name>         
                 <param-value>  变量 </param-value>       
              </init-param>     
     </filter>
    <filter-mapping>
         <filter-name>文件名</filter-name>
         <url-pattern>/*</url-pattern>
    </filter-mapping>
    • 若与servlet有联系,需插入下一段代码:
    <servlet> 
         <servlet-name>Demo1</servlet-name> 
         <servlet-class>servlet.Demo1</servlet-class> 
    </servlet>
    三、与servlet联系的例子——解决中文问题
    1、创建新的javaweb工程TestFL,在filter包下创建CharacterEncoderFilter.java——
    public class CharacterEncoderFilter implements Filter{ 
     private FilterConfig filterConfig=null; 
     public void destroy() { } 
     public void doFilter(ServletRequest req, ServletResponse resp, 
           FilterChain chain) throws IOException, ServletException {  
              String charset=filterConfig.getInitParameter("charset");  
              req.setCharacterEncoding(charset); 
              resp.setCharacterEncoding(charset); 
              resp.setContentType("text/html;charset="+charset);  
              chain.doFilter(req, resp);    
     } 
     public void init(FilterConfig filterConfig) throws ServletException { 
              this.filterConfig=filterConfig; 
      } 
    } 

    2、servlet包下的Demo2.java——

    public class Demo2 extends HttpServlet {   
     public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
                doPost(request, response);
      }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
              String username=request.getParameter("username");
              System.out.println(username);
              response.getWriter().write("中文");
      }
    }

    3、在web.xml中要再声明一次filter文件名、变量名和servlet文件 :

    (注意此处的/*是代表网址不需要写文件名,只需要写 http://localhost:8080/TestFL/,
    若为/abc/*,则要写为 http://localhost:8080/TestFL/abc/ 才能运行)
    <filter>
          <filter-name>CharacterEncoderFilter</filter-name>
          <filter-class>filter.CharacterEncoderFilter</filter-class>
          <init-param>
              <param-name>charset</param-name>
              <param-value>utf-8</param-value>
           </init-param>
     </filter>
    
    <filter-mapping>
            <filter-name>CharacterEncoderFilter</filter-name>
            <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <servlet>
            <servlet-name>Demo1</servlet-name>
            <servlet-class>servlet.Demo1</servlet-class>
    </servlet>
     <servlet-mapping>
            <servlet-name>Demo1</servlet-name>
            <url-pattern>/Demo1</url-pattern>
    </servlet-mapping>   

    3、在jsp文件中设计个简单form:(记得将pageEncoding改为utf-8)

    <form action="/TestFL/Demo2" method="post">
             用户名:<input name="username"/>
             <input type="submit" value="提交" />
     </form>

    4、打开tomcat服务,Redeploy部署文件,在浏览器上运行http://localhost:8080/TestFL/,提交后如图所示:(所有页面的请求都要经过该过滤器先行过滤 )

     

  • 相关阅读:
    Java 原理性文章收录
    kafka connect userguide【confluence】
    curl 工具使用
    MySQL 数据类型
    Kafka Producer (0.10.0.0)原理
    Kafka Consumer 原理与实践
    java 泛型详解
    redis 高可用集群之水平扩展
    Redis 5.0.0 安装(集群)
    Apollo(阿波罗)架构深度剖析
  • 原文地址:https://www.cnblogs.com/aceview789/p/4921244.html
Copyright © 2011-2022 走看看