javaweb学习总结之过滤器Filter

javaweb学习总结之过滤器Filter

    • 一、概念
    • 二、Filter是如何实现拦截的?
    • 三、生命周期
    • 四、注册Filter
    • 五、映射Filter
    • 演示用Filter防止用户不通过登录而输入网址直接进入主页

一、概念

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
  Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,
过滤器是用来拦截请求的,而不是处理请求的。
当用户请求某个Servlet或其他资源(JSP/css/html)时,会先执行部署在这个请求上的Filter,如果Filter放行,那么会继续执行用户请求的资源,如果Filter不放行,那么就不会执行用户请求的资源。
如果有多个过滤器则会形成过滤链,根据在XML部署顺序 逐层拦截,直到通过所有的过滤器才可请求到资源,而后逐个放行,将资源返回给客户端。

二、Filter是如何实现拦截的?

Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问web资源)。
调用目标资源之后,让一段代码执行。

web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。

三、生命周期

Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

四、注册Filter

开发好Filter之后,需要在web.xml文件中进行注册,这样才能够被web服务器调用
注册时可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。

  <filter>
    <filter-name>filterfilter-name>
    <filter-class>myFilter.firstFilterfilter-class>
    <init-param>
    <param-name>NotFilterparam-name>
    <param-value>index.jsp;fail.jsp;loginServlet;param-value>
    init-param>
  filter>

五、映射Filter

映射时用来指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。

  <filter-mapping>
  <filter-name>filterfilter-name>
  <url-pattern>/*url-pattern>我们这里用/*表示根目录下的所有URL
  filter-mapping>
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

演示用Filter防止用户不通过登录而输入网址直接进入主页

// An highlighted block
package myFilter;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class firstFilter implements Filter {
     
	
	private FilterConfig config;
	
	public void destroy() {
     
		System.out.println("destroy!!");
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
     
		
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		//获取到xml中部署的初始化参数
		String NotFilter = config.getInitParameter("NotFilter");
		if(NotFilter != null) {
     
			String[] arr = NotFilter.split(";");
			for(String s:arr) {
     
				if(s.equals("")||s ==null)continue;
				//1、如果本页的URL是XML中标记可放行的 则放行 
				if(req.getRequestURI().indexOf(s) != -1) {
     
					System.out.println(s+"准备放行!");
					chain.doFilter(request, response);
					return;
				}
			}
		}
		//2、本页是主页 若有session放行
		if(req.getSession().getAttribute("username")!=null) {
     
			chain.doFilter(request, response);
		}else
			//不是或者无session则重定向至index.jsp的登录页面
		res.sendRedirect(req.getContextPath()+"/index.jsp");	
	}

	public void init(FilterConfig fConfig) throws ServletException {
     
		config = fConfig;//获得初始化的config
	}

}

第一篇博文,多多指点。

你可能感兴趣的:(javaweb,Filter,javaweb)