一、什么是过滤器
①、Filter过滤器是JavaWeb的三大组件之一。三大组件分别是Servlet程序、Listener监听器、Filter过滤器
②、Filter过滤器是JavaEE的规范,即接口。
③、Filter过滤器的作用是:拦截请求(主要)、过滤响应。
拦截请求常见的应用场景:
1、权限检查
2、日记操作
3、事务管理
4、……等等
二、Filter的初体验
要求:在你的web工程下有一个admin目录。admin目录下的所有资源(HTML页面,图片文件、jsp等等)必须是用户登录后才能允许访问
思考:用户登录后把用户信息保存到Session域中,所以检查用户是否登录,可以判断Session域中是否包含用户登录信息即可。
在src中新建com.gychen.filter
在filter里新建AdminFilter.java类
在web.xml里配置路径
1 package com.gychen.filter; 2 3 import javax.servlet.*; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpSession; 6 import java.io.IOException; 7 8 public class AdminFilter implements Filter { 9 @Override 10 public void init(FilterConfig filterConfig) throws ServletException { 11 12 } 13 14 /** 15 * doFilter方法,专门用于拦截请求(可以做权限检查)、过滤响应。 16 * @param servletRequest 17 * @param servletResponse 18 * @param filterChain 19 * @throws IOException 20 * @throws ServletException 21 */ 22 @Override 23 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 24 HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; 25 HttpSession session = httpServletRequest.getSession(); 26 Object user = session.getAttribute("user"); 27 // 如果等于null,说明还没有登录 28 if (user == null){ 29 servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); 30 return; 31 }else { 32 // 让程序继续往下访问用户的目标资源 33 filterChain.doFilter(servletRequest,servletResponse); 34 } 35 } 36 37 @Override 38 public void destroy() { 39 40 } 41 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 5 version="4.0"> 6 7 8 9 <!--filter标签用于配置一个filter过滤器--> 10 <filter> 11 <!--给filter起一个别名--> 12 <filter-name>AdminFilter</filter-name> 13 <!--配置filter全类名--> 14 <filter-class>com.gychen.filter.AdminFilter</filter-class> 15 </filter> 16 17 <!--filter-mapping配置Filter过滤器的拦截路径--> 18 <filter-mapping> 19 <!--filter-name表示当前的拦截路径给那个filter使用--> 20 <filter-name>AdminFilter</filter-name> 21 <!--url-pattern配置拦截路径 22 / 表示请求地址为:http://ip:port/工程路径/ 映射到web目录 23 --> 24 <!-- /admin/* 表示请求地址为:http://ip:port/工程路径/admin/* --> 25 <url-pattern>/admin/*</url-pattern> 26 </filter-mapping> 27 </web-app>
Filter过滤器使用步骤:
1、编写一个类去实现Filter接口。
2、实现过滤方法doFilter()。
3、在web.xml中配置Filter的拦截路径。
三、Filter的生命周期
Filter的生命周期包含几个方法:
①、构造器方法
②、init初始化方法
①和②在web工程启动时执行(Filter已经创建)
③、doFilter过滤方法
③,每次拦截到请求就会执行
④、destroy方法
④,停止web工程时执行(停止web工程也会销毁Filter过滤器)
四、FilterConfig类
五、FilterChain 过滤器链
在com.gychen.filter中新建两个filter来验证上述原理
在web.xml中配置filter过滤配置路径
1 package com.gychen.filter; 2 3 import javax.servlet.*; 4 import java.io.IOException; 5 6 public class Filter1 implements Filter { 7 8 @Override 9 public void init(FilterConfig filterConfig) throws ServletException { 10 11 } 12 13 @Override 14 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 15 16 System.out.println("Filter1 前置代码"); 17 filterChain.doFilter(servletRequest,servletResponse); 18 System.out.println("Filter1 后置代码"); 19 } 20 21 @Override 22 public void destroy() { 23 24 } 25 }
1 package com.gychen.filter; 2 3 import javax.servlet.*; 4 import java.io.IOException; 5 6 public class Filter2 implements Filter { 7 8 @Override 9 public void init(FilterConfig filterConfig) throws ServletException { 10 11 } 12 13 @Override 14 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 15 16 System.out.println("Filter2 前置代码"); 17 filterChain.doFilter(servletRequest,servletResponse); 18 System.out.println("Filter2 后置代码"); 19 } 20 21 @Override 22 public void destroy() { 23 24 } 25 }
1 <filter> 2 <filter-name>Filter1</filter-name> 3 <filter-class>com.gychen.filter.Filter1</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>Filter1</filter-name> 7 <url-pattern>/target.jsp</url-pattern> 8 </filter-mapping> 9 10 <filter> 11 <filter-name>Filter2</filter-name> 12 <filter-class>com.gychen.filter.Filter2</filter-class> 13 </filter> 14 <filter-mapping> 15 <filter-name>Filter2</filter-name> 16 <url-pattern>/target.jsp</url-pattern> 17 </filter-mapping>
六、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 结尾才会拦截到Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!