过滤器学习(一)

对于过滤器的学习首先能想到的是过滤器是什么?过滤器怎么使用的
现在来介绍一下普通常见的案例:
在化学实验室中经常做实验的时候用的过滤纸,在做实验的时候,我们使用滤纸把浑浊的液体过滤成纯净的液体。当然我们人身体上也有过滤的案例,比如人的淋巴系统就是过滤血夜中的杂质的。
通过这几个案例可以分析出,过滤器首先需要过滤源,就是说我们的过滤器需要过滤什么东西,然后是过滤规则,比如滤纸孔径大小的设置,过滤不同的东西,最后是得到过滤结果
总的流程是:过滤源–>过滤规则–>过滤结果
在web开发中,我们每发出一个请求,就是调用了web网页的过滤器,但是web过滤器不可以直接处理请求,案例:在访问百度文库的时候,点击发表文章,的时候,如果没有登录就会被百度设置的拦截器所拦截,当然也可以直接复制这一段网址,直接访问,依旧是被拦截。虽然我们访问的是同一个地址,但是再登录前和登录后显示的却不是同一个效果,返回的响应数据不同。
过滤器定义:
过滤器是一个服务器端的组件,他可以截取用户端的请求与响应信息,并对这些信息过滤。
过滤器的工作原理:
不存在过滤器的情况下,我们用户访问web资源是可以直接请求的
存在过滤去的情况下,我们用户访问web资源是不可以直接请求的
首先,过滤器是在web资源启动的时候加载的,这样web一启动,过滤器就开始生效了。这个时候,用户发送的请求,就不会直接到web容器了,会先到我们的过滤器上,然后过滤器会根据过滤规则来判断用户的
请求合不合规,复合规则,就会把用户的请求发送给web资源,web资源就会把资源响应信息发送给过滤器,再从过滤器把web资源的响应信息发送给用户
过滤器工作原理流程:用户发送请求–》过滤器过滤请求–》请求合规–》过滤器将用户请求发送到web资源–》web资源在将响应信息发送至过滤器–》过滤器将web资源发送给用户
过滤器的生命周期:
先实例化,实例化是在web.xml中通过配置,再web容器启动的时候开始加载过滤器,实例化只实例化一次,实例化以后,就会进入初始化,调用过滤器的init()方法,初始化过滤器的一些信息,初始化也只会初始化一次,然后是过滤方法,调用过滤器的doFilter()方法,过滤器的过滤方法是可以执行无数次的,因为每次请求都会执行我们的过滤方法的,再然后是销毁,会调用过滤器的destroy()方法,再web容器关闭的时候会调用销毁方法。
过滤器生命周期流程:实例化(再web.xml中配置过滤器)–》初始化(init()方法)–》过滤(doFilter()方法)–>销毁(destroy()方法)
过滤器链:
web容器是支持多个过滤器的,多个过滤器执行的时候服务器会按照web.xml中定义的先后顺序组装成一条链,来依次执行,并依次返回的
例如:web容器中配置了过滤器1,过滤2,过滤器3
用户请求–》过滤器1(start方法)–》过滤器2(start方法)–》过滤器3(start方法)–》web资源
web资源返回–》过滤器3(end方法)–》过滤器2(end方法)–》过滤器1(end方法)–》用户
过滤器的分类:
分为四大类:request,forward,include,error 过滤器默认使用的是request, 可以在web.xml过滤器中的设置(编辑器会把<给处理掉,所以> request:用户之间访问页面时,web容器将会调用过滤器。
forward:目标资源是通过RequestDispatcher的forward方法访问时,该过滤器将会被调用
include:目标资源是通过RequestDispatcher的include方法调用时,过滤器将会被调用
error:目标资源是通过声明式异常处理的机制调用时,过滤器将会被调用
简单的过滤器实现:
在web.xml中配置

  
    
      FilterTest  
      com.test.Filter1  
    
    
    
      FilterTest  
        
      /index.jsp  
   

实现filter接口

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Filter1 implements Filter{

	public void destroy() {
		System.out.println("Filter1---destroy--销毁");
		
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		System.out.println("Filter1-start--dofilter");
		HttpServletRequest req=(HttpServletRequest)arg0;
		HttpServletResponse resp=(HttpServletResponse)arg1;
		resp.sendRedirect(req.getContextPath()+"/main.jsp");		
		System.out.println("Filter1-end--dofilter");
	}

	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("Filter1---init--初始化");
		
	}

}

然后输入地址:http://localhost:9090/test-web/index.jsp
就会跳转到main.jsp页面

注意:servlet3.0的时候,不需要再web.xml中配置了,只需要在实现filter接口的类的上面加上
@WebFilter(servletNames={“SimpleServlet”},filterName=“SimpleFilter”,urlPatterns="/index.jsp")即可

你可能感兴趣的:(java)