Filter——“婚姻”拦路虎

一、概述

  • 今天要说的是过滤器,因为有这样一个生动的例子(下面会给出),所以我把他叫做“婚姻拦路虎”。
  • 作用:在一个请求去访问某个资源的时候,filter可在这个请求访问到资源之前,把请求拦下,然后做出一系列的处理和判断。
  • 比如编码转换、信息的过滤、权限的判断、是否已经登录的验证等等,最后filter在决定是否要让这个请求去访问资源。
    例图

二、 下面举一个较为生动的例子去帮助理解

假如你要向你的女朋友求婚,这个时候已经不是你们两个人的事了,而是两个家庭的事情,所以呢,你要面对的是丈母娘,老丈人,可能还有小舅子的质疑。下面给出三个类的代码:
1、MotherFilter

package com.qiao.day5;

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;

@WebFilter("/*")
public class MotherFilter implements Filter {

	public MotherFilter() {

	}

	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("丈母娘:小伙子,你有房有车吗?");
		chain.doFilter(request, response);
		System.out.println("丈母娘:好女婿");
	}

	public void init(FilterConfig fConfig) throws ServletException {

	}

}

2、FatherFilter

package com.qiao.day5;

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;

@WebFilter("/*")
public class FatherFilter implements Filter {

	public FatherFilter() {

	}

	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("老丈人:小伙子,会喝酒吗?");
		chain.doFilter(request, response);
		System.out.println("老丈人:好女婿呀");
	}

	public void init(FilterConfig fConfig) throws ServletException {

	}

}

3、BrotherFilter

	package com.qiao.day5;

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;

@WebFilter("/*")
public class BrotherFilter implements Filter {

	public BrotherFilter() {

	}

	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("小舅子:你能给我什么好处?");
		chain.doFilter(request, response);
		System.out.println("小舅子:好姐夫");
	}

	public void init(FilterConfig fConfig) throws ServletException {

	}

}

4、再给你来个女朋友

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>请查收你的女朋友</title>
</head>
<body>
	<h1>我同意</h1>
</body>
</html>

然后呢,你这个浏览器要求婚了,结果是这样的:
求婚结果

  • 在这个实例中,你就相当于浏览器,你要对你的女盆友发送求婚的请求(你的女盆友就相当于服务器),中间要遭到丈母娘、老丈人、小舅子的拦截,而这三个就相当于三个过滤器,称为过滤器链。

三、过滤器中的方法

1、大家在类中也看到了,每一个实现Filter接口的类中都有三个方法,下面逐个介绍下这几个方法:

  • init()

    • 这个过滤器类被服务器创建对象的时候会调用到这个方法
  • destroy()

    • 过滤器对象被销毁的时候会调用这个方法
  • doFilter()

  • 当过滤器拦截到请求的时候,会调用这个doFilter

  • 其中最重要的doFilter方法有三个参数
    方法2、解释

  • 同一个请求有可能要依次的通过俩个或者多个过滤器,在web中把这样多个过滤器看做一个过滤器链条对象,就是用这个FilterChain类型的对象来表示

  • chain.doFilter(req,res)表示把当前的req和res传给这个过滤器链条中的下一个过滤器进行过滤,如果说链条中已经没有下一个过滤器,那么就把这次访问放行,让它去访问它真正要访问的资源。

注意

  • 如果这次访问没有符合过滤器中的条件,那么我们就不用调用chain.doFilter(req,res)这个方法把这次访问放行了。
  • 可以直接进行跳转(服务器内部跳转或者客户端重定向),跳转到一个页面,页面中提示用户一下,为什么这次不让他去访问, 比如说: 还没有登录、权限不够等等原因。

四、编码过滤器

我们每一次写Servlet相关类时,总要写一些设置编码相关的设置,但是有了这个编码过滤器就不需要一个个去设置了。

package com.qiao.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.annotation.WebFilter;

@WebFilter("/*")
public class EncodingFilter implements Filter {

  
    public EncodingFilter() {
    }

	public void destroy() {
	}

	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		chain.doFilter(request, response);
	}

	
	public void init(FilterConfig fConfig) throws ServletException {
		
	}

}

五、过滤器的配置

  • 过滤器有两种配置方式
  • 第一种为在web.xml中配置
web.xml方式:
<filter>标签中也能使用<init-param>给过滤器传值

<filter>
			<filter-name>encodingFilter</filter-name>
			<filter-class>com.qiao.EncodingFilter</filter-class>
</filter>
<filter-mapping>
			<filter-name>encodingFilter</filter-name>
			<url-pattern>/*</url-pattern>
</filter-mapping>

其中<url-pattern></url-pattern>有四种配置方式

第一种 精确匹配
			<url-pattern>/test_servlet</url-pattern>
			表示此拦截器只会拦截/test_servlet这一个路径
第二种 扩展名匹配
			<url-pattern>*.html</url-pattern>
			表示此拦截器只会拦截后缀名是.html的路径
第三种 路径匹配
			<url-pattern>/test/*</url-pattern>
			表示此拦截器拦截/test路径下的所有资源
第四种 匹配任意的url
			<url-pattern>/*</url-pattern>
  • 第二种为注解配置
 @WebFilter("/*")

六、过滤器的执行顺序

  • 如果有多个过滤器,并且多个过滤器拦截的路径有相同的部分,就有一些路径被会这多个过滤器共同拦截,那么过滤器的顺序是按照web.xml中配置的顺序从上到下执(以实际测试为准)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值