文章目录
Filter:过滤器
概念
- 生活中的过滤器:净水器,空气净化器
- web中的过滤器,当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
作用
- 一般用来拦截一些通用的操作.如:登录验证,统一编码设置,敏感字符过滤…
快速入门
步骤:
- 定义一个类,实现Filter接口
- 复写方法
- 配置(配置拦截路径)    - web.xml配置
- 注解配置
 
package per.leiyu.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/** * @author 雷雨 * @date 2020/5/17 9:26 * * 过滤器的快速入门 * 1.创建一个类实心Filter接口(注意导入的包是javax.servlet.Filter) * 2.复写方法 * 3,配置拦截路径 */
@WebFilter("/*")
public class FilterDemo1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo1被执行了....");
        filterChain.doFilter(servletRequest,servletResponse);//拦截放行
    }
    @Override
    public void destroy() {
    }
}
过滤器细节:
1.使用web.xml配置拦截路径
和注解方法的配置的作用是一样的
<filter>
  <filter-name>demo1</filter-name>
  <filter-class>per.leiyu.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
  <filter-name>demo1</filter-name>
  <!--表示的是拦截路径 -->
  <url-pattern>/*</url-pattern>
</filter-mapping>
2.过滤器执行过程
拦截前对request资源进行增强------>执行要拦截的资源------->拦截之后对于response资源进行增强
3.过滤器生命周期方法
package per.leiyu.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/** * @author 雷雨 * @date 2020/5/17 10:36 */
@WebFilter(filterName = "FilterDemo3")
public class FilterDemo3 implements Filter {
    public void destroy() {
        //在服务器启动后自动执行,只执行一次,一般用于资源的加载
        System.out.println("filter拦截器执行之前");
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //我们需要拦截器执行的业务逻辑方法写在这里
        System.out.println("filter拦截器执行");
        chain.doFilter(req, resp);
    }
    public void init(FilterConfig config) throws ServletException {
        //在服务器关闭时执行,只执行一次,一般用于资源的释放
        System.out.println("filter拦截器执行后");
    }
}
4.过滤器配置详解
4.1拦截路径的配置
- 具体的资源路径: 例如/index.jsp 只有访问index.jsp资源时过滤器才会执行
- 目录拦截: /user/* 访问/user下的所有资源时,过滤器都会执行
- 后缀名拦截: *.jsp 访问所有后缀名为jsp的资源时,过滤器都会被执行
- 拦截所有资源: /* 访问所有资源时,过滤器都会被执行
package per.leiyu.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/** * @author 雷雨 * @date 2020/5/17 10:46 * *拦截路径的配置方式 * 1:具体的路径拦截 */
//@WebFilter("/index.jsp") //具体的路径拦截
//@WebFilter("/user/*") //目录拦截方式
//@WebFilter(".jsp") //后缀名拦截方式
@WebFilter("/*")    //拦截所有的资源
public class FilterDemo4 implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo4...");
        chain.doFilter(req, resp);
    }
    public void init(FilterConfig config) throws ServletException {
    }
}
4.2拦截方式的配置
- 拦截方式:资源被访问的方式
我们之前的资源的访问方式可以是:
 1.发送请求,即直接浏览器向服务器发送请求,
 2.请求转发,正在访问浏览器的资源,在浏览器中进行请求转发,直接访问服务器中的资源
而现在用Filter也可以来配置资源被访问的方式(拦截方式),有两种方式
4.2.1注解方式配置拦截方式
- 设置dispatcherTypes属性:    - REQUEST:默认值.浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
 
4.2.2web.xml方式配置拦截方式
设置dispatherTypes标签
<filter>
  <filter-name>demo1</filter-name>
  <filter-class>per.leiyu.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
  <filter-name>demo1</filter-name>
  <!--表示的是拦截路径 -->
  <url-pattern>/*</url-pattern>
  <!--dispatherTypes还是5个取值和在注解中的取值是一样的 -->
  <dispatherTypes>REQUEST</dispatherTypes>
</filter-mapping>
5.过滤器链(配置多个过滤器)
- 执行顺序的问题:
如果有两个过滤器,分别为过滤器1和过滤器2
执行顺序:
过滤器1---->过滤器2---->资源执行----->过滤器2----->过滤器1
-  过滤器先后顺序问题: -  注解配置:按照类名的字符串比较规则比较,值小的先执行 如:AFilter 和BFilter ,那么肯定是AFilter过滤器先执行 
-  web.xml:谁定义在上面,谁先执行 
 
-  
案例:登录验证:
需求:
- 访问case_filter案例的资源.验证其是否登录
- 如果登录了,则直接放行
- 如果没有登录,则跳转带登录页面,提示"您尚未登录,请先登录"
Listener***
- web的三大组件之一.
事件监听机制:
- 事件: 一件事情
- 事件源 事件发生的地方
- ***: 一个对象
- 注册监听: 将事件.事件源,***绑定在一起.当事件源上发生某个事件后,执行***代码
servletContextListener:监听servletContext对象的创建和销毁
-  void contextDestroyed(ServletContextEvent sce):servletContext对象在销毁之前会调用这个方法 
-  void contextInitialized(ServletContextEvent sce):servletContext对象在创建后悔调用该方法 -  一般用于加载资源 
-  步骤: -  获取servletContext对象:servletContext servletcontext = servletContextEvent.getservletContext(); 
-  加载资源文件 String contextfigLocation = servletContext.getInitParameter(“contextfigLocation.xml”); 
-  获取真实路径 Sting realPath = servletContext.getReaPath(contextfigLocation ) 
-  用一个流对象关联(加载进内存 FileInputStream fis = new FileInputStream(realpath); 
 
-  
 
-  
实现***的步骤:
- 定义一个类,实现servletContextListener接口
- 复写方法
- 配置    - web.xml
- 注解的配置方式
 

 京公网安备 11010502036488号
京公网安备 11010502036488号