Filter学习过滤器

Filter学习过滤器

1. Filter 过滤器

1.1 Filter概述
生活中的过滤器
	净水器滤芯,空气滤芯,空调滤芯
网络中的过滤器
	有些网站未登录状态下是无法访问的
	给你们我自己访问taobao订单页连接,但是你们无法访问我的订单。需要进行登录操作
	
过滤器的作用:
	验证登录信息,处理字符问题,过滤跳转
1.2 Filter快速入门
步骤:
	1. 自定义一个类,遵从 Filter接口 javax.servlet.Filter 接口,【千万别导错包】
	2. 重写方法
	3. 配置Filter
		a. 注解方式
		b. web.xml
package com.lexo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * 快速入门Filter
 * @WebFilter("/*") 访问所有的资源全部过滤
 */
@WebFilter("/*")
public class FilterDemo1 implements Filter {
    public FilterDemo1() {
        System.out.println("Constructor called...");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init called");
    }

    /**
     * 过滤器的核心方法
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter called ...");

        // 放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("Destroy called...");
    }
}
<filter>
    <filter-name>FilterDemo1</filter-name>
    <filter-class>com.lexo.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
    <filter-name>FilterDemo1</filter-name>
    <!-- 过滤器过滤路径 -->
    <url-pattern>/*</url-pattern>
</filter-mapping>
1.3 Filter细节处理
1.3.1 Filter执行流程
浏览器访问服务器资源资源的路径,匹配到 Filter,会被Filter过滤
	1. 执行 过滤器
	2. 是否满足条件
    	满足: 放行,获取资源
    	不满足: 哪里来的哪里去,跳转到其他页面
    3. 放行之后,执行资源,在回到过滤,最后给予用户响应
1.3.2 Filter生命周期
类比 Servlet 生命周期,非常类似

1. Filter类对象的构造方法 Constructor
2. Filter类对象的init初始化
3. doFilter过滤器核心方法执行 
	doFilter(ServletRequest request, ServletResponse, FilterChain chain)
4. 服务器正常关闭,执行的destroy方法
1.3.3 Filter过滤路径问题
设置过滤器的拦截路径
	a. 具体拦截哪一个资源 /index.jsp
		这里要求拦截的是 index.jsp
	b. 拦截目录 /user/*
    	拦截 /user 路径下的所有资源
	c. 拦截后缀 *.do *.jsp 
		拦截指定的后缀名 *.jsp 所有的jsp文件都会被拦截
 	d. 拦截所有资源 /*
 		只要是当前Web Application内的资源都会被拦截
1.3.4 拦截方式配置
a. 注解方式
	@WebFilter中 使用DispatcherType,值是一个数组类型
		REQUEST 默认值,用户通过浏览器直接请求资源
		FORWARD 转发拦截,用户请求资源之后,被服务器资源转发给其他资源
		ASYNC 异步拦截
		ERROR 错误拦截
		INCLUDE 包含资源拦截
b. web.xml
	在filter-mapping 标签中
		使用<dispatcher>\</dispatcher> 配置
		配置内容同上
1.3.5 过滤器链
过滤器两个 FilterDemo4 FilterDemo5
    1. FilterDemo4
    2. FilterDemo5
    3. Add Servlet
    4. FilterDemo5
    5. FilterDemo4	
WHY???

过滤的执行先后顺序。是非常随意的!!!按照字符串的比较方式,升序进行!!!
使用注解方式设置:
	比较过滤器的类名字符串比较
		AFilter BFilter

使用web.xml 配置
	<filter-mapping>
		哪一个Filter对应的filter-mapping在前,先执行谁

2. Filter使用案例

2.1 登录验证
1. 从用户访问服务器资源。浏览器自带Cookie中,获取Session信息
	用户已经登录:	可以访问资源
	用户没有登录: 跳转到登录界面

我们需要过滤的资源是登录之后才可以访问的资源
但是如果用户访问的资源刚刚好就是登录内容,该资源不能过滤,需要放行
2.2 敏感词处理
弹幕过滤,贴吧回帖过滤,评论过滤...
	你是笨蛋 --> 你是**

input:text name="text"
	String text = request.getParameter("text");
	获取数据之后,处理数据
	但是在HttpServletRequest对象中,没有setParameter方法

过滤器处理之后的数据依然是需要直接放行给后面的资源。
	如果使用request.setAttribute方式告知后面的资源,会导致Servlet处理数据压力过大


设计模式!!!
	通过代理模式对getParameter方法,进行增强操作!!!
发布了20 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41426763/article/details/100999120