当前位置:编程学习 > JAVA >>

不可小觑的Filter

java的过滤器Filter是个好东西,故名思议:用于过滤一些信息,过滤什么?什么时候过滤?怎么过滤?

 


先理解一下Filter:

Filter 不是一个servlet,它不能产生一个response,但是他能够在一个request到达servlet之前预先处理request,也可以在一个响应离开 servlet时处理response。故,用户可以使用filter改变一 个request或修改一个response。

 


Filter的过滤:

Filter和servlet的对应关系为多对多的关系 ,可以配置一个filter 到一个或多个servlet;而一个servlet可以有多个filter。

 

 

什么时候过滤:

编码转换:

  Servlet过滤器在请求进入服务程序前都进行编码转换,解决跨平台的乱码问题。


添加统一的标题或脚注:


  统一风格。

进行安全的控制:

  用户辨认filter;日志filter;审核filter;加密filter;符号filter……

其他:

  改变xml内容的XSLT filter。

 


怎么过滤:

实现过滤器API的3个接口:Filter 、Filter Chain 和 Filter Config。

过滤器类将实现 Filter 接口,然后使用这个过滤器类中的 Filter Chain 和 Filter Config 接口。该过滤器类的一个引用将传递给 Filter Chain 对象,以允许过滤器把控制权传递给链中的下一个资源。Filter Config 对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。


一般,filter都是一个链,在web.xml里配置,并且按照顺序执行,将请求转发给过滤链上的下一个对象,如果没有下一个filter链的节点,那就是你的请求资源。

 

 

须理解的三个重要的方法:init()、doFilter ()、destroy()

init():这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 Filter Config 类型的对象作为输入。
doFilter ():与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet())来处理请求一样,过滤器拥有单个用于处理请求和响应的方法——doFilter方法。这个方法接受三个输入参数:一个 Servlet Request、response 和一个 Filter Chain 对象。
destroy():正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。

 

 

代码加深理解:过滤用户名和年龄的输入

input.jsp过滤器检测姓名和年龄,正常的话,提交给output.jsp,如果异常,提交给erroroutput.jsp,同时还有一个过滤器,用来检测一个页面是否设置了字符编码,如果没有则进行设置(防止乱码)。

 


myfilter.java:

 

[java]  package servletbean; 
import javax.swing.JOptionPane; 
public class myfilter implements Filter{ 
 
    public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServeltExcepiton{ 
         
        response.setContentType("text/html"); 
        response.setCharacterEncoding("GB2312"); 
        PrintWriter out = response.getWriter(); 
        String name =""; 
        String age =""; 
 
        int age1; 
        name =request.getParameter("name"); 
        age = request.getParameter("age"); 
         
        RequestDispatcher dispatch = request.getRequestDispatcher("erroroutput.jsp"); 
         
        if(name ==null || name="" ||name =" " || age==null){ 
            JOptionPane.showMessageDialog(null,"用户名和年龄输入错误!"); 
            dispatch.forward(request,response); 
            return ; 
 
        }else{ 
            try{ 
 
                age1=Integer.parseInt(age); 
            }catch(Excepiton e){ 
                 
                //JOptionPane.showMessageDialog(null,"年龄必须为数字!");  
                dispatch.forward(request,response);//如果是错误页面就到erroroutput.jsp中  
                return ; 
 
            } 
        } 
 
 
        //正确的输入,chain会自动查找下一个链,但是下面没有了,所以,就会跳转页面了,action="output.jsp"  
        chain.doFilter(request,response);    
         
 
         
    } 
 
 
 

package servletbean;
import javax.swing.JOptionPane;
public class myfilter implements Filter{

 public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServeltExcepiton{
  
  response.setContentType("text/html");
  response.setCharacterEncoding("GB2312");
  PrintWriter out = response.getWriter();
  String name ="";
  String age ="";

  int age1;
  name =request.getParameter("name");
  age = request.getParameter("age");
  
  RequestDispatcher dispatch = request.getRequestDispatcher("erroroutput.jsp");
  
  if(name ==null || name="" ||name =" " || age==null){
   JOptionPane.showMessageDialog(null,"用户名和年龄输入错误!");
   dispatch.forward(request,response);
   return ;

  }else{
   try{

    age1=Integer.parseInt(age);
   }catch(Excepiton e){
    
    //JOptionPane.showMessageDialog(null,"年龄必须为数字!");
    dispatch.forward(request,response);//如果是错误页面就到erroroutput.jsp中
    return ;

   }
  }


  //正确的输入,chain会自动查找下一个链,但是下面没有了,所以,就会跳转页面了,action="output.jsp"
  chain.doFilter(request,response); 
  

  
 }

 

}

encodefilter.java:

 

[java] package servletbean; 
public class encodefilter implements Filter{ 
 
    public void doFilter (ServletRequest request, ServletResponse response,Filte

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,