过滤器过滤不可小觑的Filter

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

原文地址:https://www.cnblogs.com/jiangu66/p/3111425.html