• 过滤器过滤不可小觑的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
    过滤器和过滤
    ---------------------------------

  • 相关阅读:
    STM32学习笔记10(实时时钟RTC)
    STM32学习笔记9(SysTick滴答时钟)
    STM32学习笔记8(DMA控制器)
    STM32学习笔记7(增量式PID的实现)
    STM32学习笔记6(TIM通用模块生成PWM)
    STM32学习笔记5(TIM通用模块定时功能)
    STM32学习笔记4(TIM32位定时器的实现)
    特权同学笔记-榨干FPGA片上存储资源
    MWC四轴飞行器代码解读
    渣硕的硬件、嵌入式软开秋招
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3111425.html
Copyright © 2020-2023  润新知