Filter
Listener
跳转到目录
过滤器:一个拥有过滤/拦截功能的东西,过滤掉一些不想要的,不和谐的东西.
生活中的过滤器:香烟过滤嘴,滤纸,净水器,空气净化器,丈母娘,土匪等. 大多数都是单向过滤器.
Web中的过滤器(Filter):Web中的一个组件/程序,就好比Servlet,过滤器就是一个特殊的类. 双向,拦截请求,拦截响应.
跳转到目录
过滤器可以对所有的请求或者响应做拦截操作.
跳转到目录
完成通用的操作
在开发中两个重要的思想:
一、可以对请求中的字符做编码
二、登录验证过滤器
三、敏感字符处理
跳转到目录
Servlet的开发和使用:
1):定义类实现javax.servlet.Servlet接口,并覆盖该接口中的方法.
2):在service方法中编写处理请求和响应的代码.
3):在web.xml中,配置Servlet,告诉Tomcat来管理当前Servlet.
<servlet>
<servlet-name>ABCservlet-name>
<servlet-class>Servlet的全限定名称servlet-class>
servlet>
<servlet-mapping>
<servlet-name>ABCservlet-name>
<url-pattern>/资源名url-pattern>
servlet-mapping>
注意:此时url-patternt,表示外界访问Servlet的名称.
Filter的开发和使用:
1):定义类实现javax.servlet.Filter接口,并覆盖该接口中的方法.
2):在doFilter方法中编写处理过滤请求和过滤响应的代码.
3):在web.xml中,配置Filter,告诉Tomcat来管理当前的Filter.
<filter>
<filter-name>ABCfilter-name>
<filter-class>Filter的全限定名称filter-class>
filter>
<filter-mapping>
<filter-name>ABCfilter-name>
<url-pattern>/资源名url-pattern>
filter-mapping>
注意:此时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("/*")
跳转到目录
注:两个经过过滤器会对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");
}
}
【1】拦截路径配置
【2】拦截方式的配置
REQUEST
:默认值,浏览器直接请求资源FORWARD
:转发访问资源
标签即可//浏览器直接请求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})
璐璐从广州开车到长沙,途径韶关收费站,株洲收费站。韶关收费站收的是路过韶关的费用,株洲收费站收的是路 过株洲的费用。如果这二座收费站业务通过了,方可到达长沙,只要其中一个收费站的业务没有通过,那么就不能 到达长沙。而且,只有通过了韶关收费站,才能到达株洲收费站。
同样,我们java代码中,有时需要对同一个请求,进行多次不同业务的过滤,所以我们java代码中需要多个过滤 器。只有所有的过滤器都对请求进行了放行,请求才能访问到目标资源,只要多个过滤器中只有一个过滤器不放行 请求,那么这个请求都不能够访问到目标资源。多个过滤器组成的一个整体我们称为过滤器链。而且,过滤器链中 的过滤器是一个一个的执行的,一个过滤器执行完毕之后,会执行下一个过滤器,后面没有过滤器了,才会访问到 目标资源。只要其中一个过滤器没有放行,那么这个过滤器后面的过滤器也都不会执行了。
【1】执行顺序
【2】过滤器先后顺序
中谁定义在上面就先执行谁跳转到目录
Web中的一个组件/程序,类似于Servlet/Filter;监听器就是监听某个对象的的状态变化的组件 监听器的相关概念.
事件源:被监听的对象 ----- 主要三个域对象 request session servletContext
监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器
响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码
Web中的监听器 : 主要用于监听作用域对象的创建; 监听作用域对象属性的添加/删除/替换;
一、监听作用域对象的创建和销毁
ServletReuestListener: 监听请求对象的创建和销毁.
HttpSessionListener: 监听会话对象(session)的创建和销毁.
ServletContextListener: 监听应用的创建和销毁.
二、监听作用域对象的属性的添加/删除/替换
ServletReuestAttributeListener: 监听request作用域中属性的添加/删除/替换
HttpSessionAttributeListener: 监听session作用域中属性的添加/删除/替换
ServletContextAttributeListener: 监听application作用域中属性的添加/删除/替换
跳转到目录
<listener>
<listener-class>com.sunny.web.listener.ContextLoaderListenerlistener-class>
listener>
注意: Listener没有自己的初始化参数. Listener如果需要使用初始化参数,只能使用全局的初始化参数.
跳转到目录
ServletContextListener:用于监听ServletContext域的创建与销毁的监听器
应用场景:服务器启动时,加载配置信息
ServletContext域的生命周期:
跳转到目录
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>/WEB-INF/classes/applicationContext.xmlparam-value>
context-param>
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系统关闭了...........");
}