您的位置:首页 > 其它

过滤器过滤不可小觑的Filter

2013-05-31 21:54 281 查看
在写这篇文章之前,xxx已经写过了几篇关于改过滤器过滤主题的文章,想要了解的朋友可以去翻一下之前的文章

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:

每日一道理

试试看——不是像企鹅那样静静的站在海边,翘首企盼机会的来临,而是如苍鹰一般不停的翻飞盘旋,执著的寻求。 试试看——不是面对峰回路转、杂草丛生的前途枉自嗟叹,而是披荆斩棘,举步探索。 试试看——不是拘泥于命运的禁锢,听凭命运的摆布,而是奋力敲击其神秘的门扉,使之洞开一个新的天地。微笑着,去唱生活的歌谣。

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:

package servletbean;
public class encodefilter implements Filter{

public void doFilter (ServletRequest request, ServletResponse response,FilterChain chain ) throws IOException ,ServletException{

if (request.getCharacterEncoding()==null){

System.out.println(encoding);
request.setCharacterEncoding(encoding);
}

//到下一个链
chain.doFilter(request,response);
}

public void init(FilterConfig fConfig)	 throws SevletException {

this.config=fConfig;
encoding =fConfig.getInitParameter("encoding");

}
}

input.jsp:

<form action ="output.jsp" name ="form" method ="post">

<table>
<tr>
<td>name</td>
<td><input type="text" name ="name"></td>
</tr>
<tr>
<td>age</td>
<td><input type="text" name ="age"></td>
</tr>
<tr>
<td><input type ="submit" name="ok" value ="ok"></td>
</tr>
</talbe>
</form>

web.xml:filter是有次序的。

<filter>

<decsription>

</decsription>

<display-name>encodefilter</display-name>
<filter-name>encodefilter</filter-name>
<filter-class>servletbean.encodefilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodefilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
<decsription>

</decsription>

<display-name>myfilter</display-name>
<filter-name>myfilter</filter-name>
<filter-class>servletbean.myfilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/output.jsp</url-pattern>
</filter-mapping>

一点儿小结:

过滤器可以在请求达到JSP或Servlet之前或响应返回客户端之前添加一些额外的操作。
如果有多个JSP页面和Servlet都需要停止一个雷同或相似的操作,我们可以把这个操作抽取到一个Servlet过滤器中,并通过匹配路径截获感兴趣JSP或Servlet。

注:以上部份,源于众多网络资源的整合,并非原创,仅限学习交流。

文章结束给大家分享下程序员的一些笑话语录:

N多年前,JohnHein博士的一项研究表明:Mac用户平均IQ要比PC用户低15%。超过6000多的参加者接受了测试,结果清晰的显示IQ比较低的人会倾向于使用Mac。Mac用户只答对了基础问题的75%,而PC用户却高达83%。

---------------------------------
原创文章 By
过滤器和过滤
---------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: