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/,提交后如图所示:(所有页面的请求都要经过该过滤器先行过滤 )

 

原文地址:https://www.cnblogs.com/aceview789/p/4921244.html