在写这篇文章之前,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
过滤器和过滤
---------------------------------