不可小觑的Filter (一)

2014-11-24 10:53:19 · 作者: · 浏览: 2

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 || nam