-
Filter
- Filter概述
- Filter的作用
- Filter的应用
- Filter的开发和使用
- Filter的细节
-
Listener
- Listener概述
- Listener编写步骤
- ServletContextListener
- 加载配置文件
跳转到目录 过滤器:一个拥有过滤/拦截功能的东西,过滤掉一些不想要的,不和谐的东西. 生活中的过滤器:香烟过滤嘴,滤纸,净水器,空气净化器,丈母娘,土匪等. 大多数都是单向过滤器. Web中的过滤器(Filter):Web中的一个组件/程序,就好比Servlet,过滤器就是一个特殊的类. 双向,拦截请求,拦截响应.
Filter的作用跳转到目录 过滤器可以对所有的请求或者响应做拦截操作.
- 以常规的方式调用资源(Servlet/JSP);
- 利用修改过的请求信息调用资源;
- 调用资源之后,但在响应到客户端之前,对响应做出修改;
- 阻止当前资源调用,代之转到其他资源.
跳转到目录 完成通用的操作
在开发中两个重要的思想:
- DRY原则: Don’t Repeat Yourself. 开发中拒绝代码重复(因为重复会带来巨大的维护成本)
- 责任分离原则: 各自做各自最擅长的事情.
一、可以对请求中的字符做编码 二、登录验证过滤器
三、敏感字符处理
跳转到目录
Servlet的开发和使用Servlet的开发和使用: 1):定义类实现javax.servlet.Servlet接口,并覆盖该接口中的方法. 2):在service方法中编写处理请求和响应的代码. 3):在web.xml中,配置Servlet,告诉Tomcat来管理当前Servlet.
ABC
Servlet的全限定名称
ABC
/资源名
注意:此时url-patternt,表示外界访问Servlet的名称.
Filter的开发和使用Filter的开发和使用: 1):定义类实现javax.servlet.Filter接口,并覆盖该接口中的方法. 2):在doFilter方法中编写处理过滤请求和过滤响应的代码. 3):在web.xml中,配置Filter,告诉Tomcat来管理当前的Filter.
ABC
Filter的全限定名称
ABC
/资源名
注意:此时url-patternt,表示对哪些资源做过滤/拦截.
url-pattern的文本内容, 如: 1: /hello.jsp --------------------> 当前Filter就仅仅只对hello.jsp资源做拦截. 2: /index --------------------> 当前Filter就仅仅只对/index资源做拦截. 3:/* --------------------> 当前Filter就对所有资源做拦截.访问任意的资源,都会先进入该过滤器器. 4:/system/* --------------------> 当前Filter就对以/system/打头的资源做拦截. /system , /system/a, /system/a/b/c, /systema.
注解配置: @WebFilter("/*")
过滤器细节跳转到目录
1. 过滤器执行流程- 请求先经过过滤器
- 经过过滤器过滤后再请求资源
- 请求完资源后再回到过滤器
注:两个经过过滤器会对request对象请求数据进行增强,对response对象响应数据进行增强(即过滤数据)
init(Filterconfig)
:代表filter对象初始化方法 filter对象创建时执行doFilter(ServletRequest,ServletResponse,FilterChan)
:代表filter执行过滤的核心方法,如果某资源在已 经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法 destory()
:代表是filter销毁方法 当filter对象销毁时执行该方法
@WebFilter("/*")
public class FilterDemo3 implements Filter {
/**
* 每一次请求被拦截资源时,会执行
* @param req
* @param resp
* @param chain
* @throws ServletException
* @throws IOException
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("FilterDemo3.doFilter..执行..");
chain.doFilter(req, resp);
System.out.println("FilterDemo3.doFilter..放行..");
}
/**
* 在服务器启动后,会创建Filter对象,然后调用init方法. 只会执行一次. (加载资源)
* @param config
* @throws ServletException
*/
public void init(FilterConfig config) throws ServletException {
System.out.println("FilterDemo3.init");
}
/**
* 在服务器关闭后,Filter对象被销毁.如果服务器是正常关闭,则执行destroy方法 (释放资源)
*/
public void destroy() {
System.out.println("FilterDemo3.destroy");
}
}
3. 过滤器配置详解
-
【1】拦截路径配置
- 具体资源路径:/index.jsp ==> 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录:/user/* ==> 访问/user下的所有资源时,过滤器都会被执行
- 后缀名拦截:*.jsp ==> 访问所有后缀名问jsp资源时,过滤器都会被执行
- 拦截所有资源:/* ==> 访问任何资源,过滤器都会被执行
-
【2】拦截方式的配置
- 注解配置(设置配置文件的 dispatcherTypes 属性)
REQUEST
:默认值,浏览器直接请求资源FORWARD
:转发访问资源 INCLUDE:包含访问资源 ERROR:错误跳转资源 ASYNC:异步访问资源 - web.xml配置 配置
标签即可
//浏览器直接请求index.jsp资源时,该过滤器会被执行 //@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST) //只有转发index.jsp资源时,该过滤器才会被执行 //@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD) //浏览器直接请求index.jsp资源,转发index.jsp资源时,该过滤器会被执行 @WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
- 注解配置(设置配置文件的 dispatcherTypes 属性)
璐璐从广州开车到长沙,途径韶关收费站,株洲收费站。韶关收费站收的是路过韶关的费用,株洲收费站收的是路 过株洲的费用。如果这二座收费站业务通过了,方可到达长沙,只要其中一个收费站的业务没有通过,那么就不能 到达长沙。而且,只有通过了韶关收费站,才能到达株洲收费站。 同样,我们java代码中,有时需要对同一个请求,进行多次不同业务的过滤,所以我们java代码中需要多个过滤 器。只有所有的过滤器都对请求进行了放行,请求才能访问到目标资源,只要多个过滤器中只有一个过滤器不放行 请求,那么这个请求都不能够访问到目标资源。多个过滤器组成的一个整体我们称为过滤器链。而且,过滤器链中 的过滤器是一个一个的执行的,一个过滤器执行完毕之后,会执行下一个过滤器,后面没有过滤器了,才会访问到 目标资源。只要其中一个过滤器没有放行,那么这个过滤器后面的过滤器也都不会执行了。
-
【1】执行顺序
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
-
【2】过滤器先后顺序
- 注解配置:按照类名的字符串比较规则进行比较,值小的先执行 eg:AFilter 和 BFilter,AFilter 先执行
- web.xml:
中谁定义在上面就先执行谁
跳转到目录 Web中的一个组件/程序,类似于Servlet/Filter;监听器就是监听某个对象的的状态变化的组件 监听器的相关概念.
事件源:被监听的对象 ----- 主要三个域对象 request session servletContext
监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码
Web中的监听器 : 主要用于监听作用域对象的创建; 监听作用域对象属性的添加/删除/替换; 一、监听作用域对象的创建和销毁
ServletReuestListener: 监听请求对象的创建和销毁. HttpSessionListener: 监听会话对象(session)的创建和销毁. ServletContextListener: 监听应用的创建和销毁.
二、监听作用域对象的属性的添加/删除/替换
ServletReuestAttributeListener: 监听request作用域中属性的添加/删除/替换 HttpSessionAttributeListener: 监听session作用域中属性的添加/删除/替换 ServletContextAttributeListener: 监听application作用域中属性的添加/删除/替换
监听器的编写步骤跳转到目录
- 编写一个监听器类去实现监听器接口
- 覆盖监听器的方法
- 需要在web.xml(注解)中进行配置 web.xml配置
com.sunny.web.listener.ContextLoaderListener
注意: Listener没有自己的初始化参数. Listener如果需要使用初始化参数,只能使用全局的初始化参数.
跳转到目录 ServletContextListener:用于监听ServletContext域的创建与销毁的监听器
应用场景:服务器启动时,加载配置信息
ServletContext域的生命周期:
- 何时创建:服务器启动创建
- 何时销毁:服务器关闭销毁
- 作用范围:整个web应用
跳转到目录
- web.xml
contextConfigLocation
/WEB-INF/classes/applicationContext.xml
- 使用ServletContextListener来加载配置文件
public class ContextLoaderListener implements ServletContextListener {
/**
* 监听ServletContext对象创建的. ServletContext对象服务器启动后自动创建
*
* 在服务器启动后自动调用
* @param servletContextEvent
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 加载资源文件
//1. 获取ServletContext对象
ServletContext servletContext = servletContextEvent.getServletContext();
//2. 加载资源文件
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
//3. 获取真实路径
String realPath = servletContext.getRealPath(contextConfigLocation);
//4. 加载进内存
try {
FileInputStream fis = new FileInputStream(realPath);
System.out.println(fis);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("Web系统启动了...........");
}
/**
* 在服务器关闭后,ServletContext对象被销毁. 当服务器正常关闭后该方法被调用
* @param servletContextEvent
*/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("Web系统关闭了...........");
}