1.定义
- Filter过滤器是JavaWeb的三大组件之一。
- 是JavaEE的规范,即接口。
2.作用
-
拦截请求,过滤响应。
-
拦截请求的常用应用场景有:
-
权限检查
-
日记操作
-
事务管理
3.使用步骤
要求:在Web工程下需要一个admin目录,这个目录下的所有资源都必须是用户登录之后才可以访问。
- 编写一个类去实现Filter接口
- 实现过滤方法doFilter()方法
- 到web.xml中去配置Filter的拦截路径
- Filter的代码:
public class AdminFilter implements Filter {
/**
* 专门用于拦截请求,可以做权限检查
* @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){
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
return;
}else {
//让程序继续执行
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
- Web.xml中的配置:
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<url-pattern>/adminFilter</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.zl.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
4.Filter的生命周期
- 构造器方法
- init初始化方法
- doFilter过滤方法
- destroy销毁方法
5.FilterConfig方法
定义
是Filter过滤器的配置文件类,Tomcat每次创建Filter时,也会同时创建FilterConfig类,这里包含了Filter配置文件的详细信息。
作用
获取Filter过滤器的配置内容:
- 获取Filter的名称filter-name的内容
- 获取在Filter中配置的init-param初始化参数
- 获取ServletContext对象
- Java代码:
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//1、获取 Filter 的名称 filter-name 的内容
System.out.println("filter-name的值是:" + filterConfig.getFilterName());
//2、获取在 web.xml 中配置的 init-param 初始化参数
System.out.println("初始化参数username的值是:"+filterConfig.getInitParameter("username"));
System.out.println("初始化参数url的值是:" + filterConfig.getInitParameter("url"));
//3、获取 ServletContext 对象
System.out.println(filterConfig.getServletContext());
}
- Web.xml配置:
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>com.zl.filter.AdminFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</filter>
6.FilterChain过滤器链
特点
- 多个Filter过滤器执行时,所有filter和目标资源默认都执行在同一个线程中。
- 多个filter共同执行的对象,都使用同一个Request对象。
- 在多个Filter过滤器执行时,执行的优先顺序是根据它们在web.xml中配置的先后顺序决定。
doFilter方法
FilterChain.doFilter()方法的作用:
- 如果有Filter,则执行下一个Filter过滤器。
- 如果没有Filter,则执行目标资源。
7.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结尾**才能拦截到
<url-pattern>*.do</url-pattern>
以上配置的路径,表示请求地址必须以**.do结尾**才能拦截到
<url-pattern>*.action</url-pattern>
以上配置的路径,表示请求地址必须以**.action结尾**才能拦截到
8.ThreadLocal
作用
可以解决多线程的数据安全问题,可以给当前线程关联一个数据(变量、对象、数组、集合)。
特点
- ThreadLocal可以为当前线程关联一个数据(可以像Map一样存取数据,key为当前线程)。
- 每一个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,则需要使用多个ThreadLocal对象。
- 每一个ThreadLocal对象实例化时,一般都是static类型。
- ThreadLocal中保存数据,在线程销毁后,会由JVM虚拟机自动释放。