Filter 过滤器
1、JavaWeb三大组件之一。三大组件分别为:servlet程序、Listener接口、Filter过滤器
2、Filter过滤器是JavaEE规范,也就是接口
3、Filter过滤器作用是:拦截请求、过滤响应。
拦截请求常见应用场景:
1、权限请求
2、日记管理
3、事物管理
……等等
Filter初体验:
要求在web工程目录下,有一个admin目录。这个目录的资源(html,css,js,jsp,jpg……)都必须是用户登录后才允许访问。
<%
Object user = session.getAttribute("user");
// if user == null ,user not login
if(user == null){
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
%>
这个方法有局限性,只能在jsp页面中使用;
Filter原理:
客户端发送请求(http://ip:port/资源路径)
服务器:
Filter过滤器:
在访问目标资源之前:
检查用户权限:有权限,直接放行(程序默认执行)
无权限:返回客户端(或者跳转到权限授予页面)
目标资源:
html页面,jsp页面,Servlet程序,txt文本,jpg图片,mp4视频……等等。
例子:
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* doFilter方法,专门用于拦截请求,可以做权限检查
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// If user == null,user no login
if(user == null){
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
}else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
web.xml配置:
<!-- <filter></filter> 用于配置一个Filter过滤器-->
<filter>
<!-- 给Filter起一个名称-->
<filter-name>AdiminFilter</filter-name>
<!-- 配置FIlter的全类名-->
<filter-class>AdiminFilter</filter-class>
</filter>
<!-- 配置filter过滤器的拦截路径-->
<filter-mapping>
<!-- 表示当前的拦截路径给哪个filter使用-->
<filter-name>AdiminFilter</filter-name>
<!-- 配置拦截路径,表示请求地址为:http://ip:port/工程路径/ 映射web目录-->
<!-- /admin/* 表示请求地址为:http://ip:port/工程路径/admin/*-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
Filter过滤器的使用步骤:
1、编写一个类去实现Filter接口
2、实现过滤方法doFilter()
3、到web.xml中去配置Filter的拦截路径
Filter生命周期:
Filter的生命周期包含的几个方法:
1、构造器方法
2、init初始化方法
第1、2步,web工程启动方式就会执行
3、doFilter过滤方法
拦截到请求时就会执行
4、destroy销毁
web工程停止时就会执行(停止web工程,会销毁Filter过滤器)
FilterConfig类
FilterConfig类,是Filter过滤器的配置文件。
Tomcat每次创建是,都会创建一个FilterConfig类,这里包含类Filter配置文件的配置信息。
FilterConfig类的作用是获取Filter过滤器的配置内容。
1、获取Filter的名称filter-name的内容
2、获取在Filter中配置的init-param初始化参数
3、获取servletContext对象
FilterChain过滤器链(多个filter执行时,他们的顺序是由它们在web.xml中配置的(从上到下)顺序决定);
filter:过滤,
chain:链条,
filterchain:就是过滤器链(多个过滤器如何一起工作)
客户端(浏览器):
htpp://ip:port/工程路径/资源
得到返回的数据
服务器(Tomcat)
配置web.xml时,需要将多个filter的访问路径配置为相同
Filter1:
doFilter(){
前置代码1
进行判断,是否有下个Filter,如果有,则跳转到下个Filter,没有继续执行目标资源;
chain.doFilter();
当访问到目标资源后,携带资源返回继续执行,若该Filter是由前面跳转而来,那么也要跳转回去执行它的后置代码2
后置代码2
}
Filter2:
doFilter(){
前置代码1
进行判断,是否有下个Filter,如果有,则跳转到下个Filter,没有继续执行目标资源;
chain.doFilter();
当访问到目标资源后,携带资源返回继续执行,若该Filter是由前面跳转而来,那么也要跳转回去执行它的后置代码2
后置代码2
}
FilterChain.doFilter()方法的作用:
1、执行下一个Filter过滤器(如果有)
2、执行目标资源(没有Filter)
目标资源:
html页面
jsp页面
Servlet程序
jpg图片
txt文本
mp4视频
……等等
多个filter过滤器执行的特点:
1、所有filter和目标资源都默认执行在同一个线程中
2、多个filter共同执行的时候,他们都使用同一个request对象;
Filter的拦截路径:
--精确匹配:
<url-pattern>/target.jsp</url-pattern>
以上配置的路径,表示请求的路径必须为:http://ip:port/工程路径/target.jsp
--目录匹配:
<url-pattern>/admin/*</url-pattern>
以上配置的路径,表示请求的路径必须为:http://ip:port/工程路径/admin/*
--后缀名匹配:
<url-pattern>*.html</url-pattern>
以上配置的路径,表示请求的地址必须以.html结尾才会拦截到
web.xml中Filter的配置:
<filter>
<filter-name>Filter2</filter-name> //别名
<filter-class>Filter2</filter-class> //类路径
</filter>
<filter-mapping>
<filter-name>Filter2</filter-name> //别名
<url-pattern>/target.jsp</url-pattern> //请求路径匹配
</filter-mapping>