Filter学习过滤器
- Filter 过滤器
1.1 Filter概述
生活中的过滤器
净水器滤芯,空气滤芯,空调滤芯
网络中的过滤器
有些网站未登录状态下是无法访问的
给你们我自己访问taobao订单页连接,但是你们无法访问我的订单。需要进行登录操作
过滤器的作用:
验证登录信息,处理字符问题,过滤跳转
生活中的过滤器
净水器滤芯,空气滤芯,空调滤芯
网络中的过滤器
有些网站未登录状态下是无法访问的
给你们我自己访问taobao订单页连接,但是你们无法访问我的订单。需要进行登录操作
过滤器的作用:
验证登录信息,处理字符问题,过滤跳转
1.2 Filter快速入门
步骤:
1. 自定义一个类,遵从 Filter接口 javax.servlet.Filter 接口,【千万别导错包】
2. 重写方法
3. 配置Filter
a. 注解方式
b. web.xml
步骤:
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…”);
}
}
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…”);
}
} -
1.3 Filter细节处理
1.3.1 Filter执行流程
浏览器访问服务器资源资源的路径,匹配到 Filter,会被Filter过滤
1. 执行 过滤器
2. 是否满足条件
满足: 放行,获取资源
不满足: 哪里来的哪里去,跳转到其他页面
3. 放行之后,执行资源,在回到过滤,最后给予用户响应
浏览器访问服务器资源资源的路径,匹配到 Filter,会被Filter过滤
1. 执行 过滤器
2. 是否满足条件
满足: 放行,获取资源
不满足: 哪里来的哪里去,跳转到其他页面
3. 放行之后,执行资源,在回到过滤,最后给予用户响应
1.3.2 Filter生命周期
类比 Servlet 生命周期,非常类似
-
Filter类对象的构造方法 Constructor
-
Filter类对象的init初始化
-
doFilter过滤器核心方法执行
doFilter(ServletRequest request, ServletResponse, FilterChain chain) -
服务器正常关闭,执行的destroy方法
类比 Servlet 生命周期,非常类似 -
Filter类对象的构造方法 Constructor
-
Filter类对象的init初始化
-
doFilter过滤器核心方法执行
doFilter(ServletRequest request, ServletResponse, FilterChain chain) -
服务器正常关闭,执行的destroy方法
1.3.3 Filter过滤路径问题
设置过滤器的拦截路径
a. 具体拦截哪一个资源 /index.jsp
这里要求拦截的是 index.jsp
b. 拦截目录 /user/*
拦截 /user 路径下的所有资源
c. 拦截后缀 *.do .jsp
拦截指定的后缀名 .jsp 所有的jsp文件都会被拦截
d. 拦截所有资源 /
只要是当前Web Application内的资源都会被拦截
设置过滤器的拦截路径
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> 配置
配置内容同上
a. 注解方式
@WebFilter中 使用DispatcherType,值是一个数组类型
REQUEST 默认值,用户通过浏览器直接请求资源
FORWARD 转发拦截,用户请求资源之后,被服务器资源转发给其他资源
ASYNC 异步拦截
ERROR 错误拦截
INCLUDE 包含资源拦截
b. web.xml
在filter-mapping 标签中
使用</dispatcher> 配置
配置内容同上
1.3.5 过滤器链
过滤器两个 FilterDemo4 FilterDemo5
1. FilterDemo4
2. FilterDemo5
3. Add Servlet
4. FilterDemo5
5. FilterDemo4
WHY???
过滤的执行先后顺序。是非常随意的!!!按照字符串的比较方式,升序进行!!!
使用注解方式设置:
比较过滤器的类名字符串比较
AFilter BFilter
使用web.xml 配置
哪一个Filter对应的filter-mapping在前,先执行谁
过滤器两个 FilterDemo4 FilterDemo5
1. FilterDemo4
2. FilterDemo5
3. Add Servlet
4. FilterDemo5
5. FilterDemo4
WHY???
过滤的执行先后顺序。是非常随意的!!!按照字符串的比较方式,升序进行!!!
使用注解方式设置:
比较过滤器的类名字符串比较
AFilter BFilter
使用web.xml 配置
哪一个Filter对应的filter-mapping在前,先执行谁
- Filter使用案例
2.1 登录验证 - 从用户访问服务器资源。浏览器自带Cookie中,获取Session信息
用户已经登录: 可以访问资源
用户没有登录: 跳转到登录界面
我们需要过滤的资源是登录之后才可以访问的资源
但是如果用户访问的资源刚刚好就是登录内容,该资源不能过滤,需要放行
- 从用户访问服务器资源。浏览器自带Cookie中,获取Session信息
用户已经登录: 可以访问资源
用户没有登录: 跳转到登录界面
我们需要过滤的资源是登录之后才可以访问的资源
但是如果用户访问的资源刚刚好就是登录内容,该资源不能过滤,需要放行
2.2 敏感词处理
弹幕过滤,贴吧回帖过滤,评论过滤…
你是笨蛋 --> 你是**
input:text name=“text”
String text = request.getParameter(“text”);
获取数据之后,处理数据
但是在HttpServletRequest对象中,没有setParameter方法
过滤器处理之后的数据依然是需要直接放行给后面的资源。
如果使用request.setAttribute方式告知后面的资源,会导致Servlet处理数据压力过大
设计模式!!!
通弹幕过滤,贴吧回帖过滤,评论过滤…
你是笨蛋 --> 你是**
input:text name=“text”
String text = request.getParameter(“text”);
获取数据之后,处理数据
但是在HttpServletRequest对象中,没有setParameter方法
过滤器处理之后的数据依然是需要直接放行给后面的资源。
如果使用request.setAttribute方式告知后面的资源,会导致Servlet处理数据压力过大
设计模式!!!
通过代理模式对getParameter方法,进行增强操作!!!
过代理模式对getParameter方法,进行增强操作!!!