不可小觑的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 ,