目录
Filter是什么?
1、JavaWEB的一个重要组件,可以对发送到servlet的请求进行拦截过滤,也可以对响应进行拦截。
2、Filter是实现了Filter接口的Java类
3、Filter需要在web.xml中进行注册,也可以通过注解来注册。
怎么创建一个Filter一只需要创建的一个类,实现Filter接口并重写方法即可。
@WebServlet("/uu.do")----对那个进行拦截如果要对所有进行拦截:("/*")
@WebServlet("/uu.do")
public class Hello implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
//主要过滤请求的方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
//销毁
@Override
public void destroy() {
Filter.super.destroy();
}
}
这就是一个生命周期:初始化/过滤请求/销毁
在xml里注册filter
<filter>
<filter-name>u</filter-name>
<filter-class>UserNameFilter</filter-class>
</filter>
<!-- 配置过滤器过滤拦截什么请求-->
<filter-mapping>
<filter-name>u</filter-name>
<!-- //对什么请求进行过滤-->
<url-pattern>/uu.do</url-pattern>
</filter-mapping>
初始化:
在创建Filter对象的时候,在servlet容器里(tomcat),加载当前web应用(当前工程)被调用只执行一次,当前Filter的初始化请求。Filter和servlet都是单例的。FilterConfig类似于ServletConfig,获取初始化参数
主要过滤请求的方法:(核心)
真正Filter要处理的逻辑代码需要写在此方法里,每次拦截都会调用这个方法。
ServletRequest:实际上当请求来的时候,实例化的还是HTTPServletRequest
ServletResponse:实际上当请求来的时候,实例化的还是HTTPServletResponse
FilterChain:过滤器链,一个项目中可以有多个过滤器,既然有多个,就会产生顺序,有顺序,就形成了链,把当前请求传给下一个
Filter顺序: 跟web.xml里的filter-mapping的顺序有关
过滤请求已经通过方法捕获到了,但是不能说,捕获到就不走了,我们是要进行判定等操作,如果条件允许,我们还是会让他通过的:
我们看到doFilter方法里,有三个参数,前两个咱们都认识,那第三个呢,欸,我们传输就用第三个参数:
filterChain.doFilter(servletRequest,servletResponse);
这就是传输给下一位,我的理解就是给他个通行证,让方法放行。
监听器 listener
专门用于对其他对象身上发生的事件或状态改变进行监听和相应的处理
主要监听作用域的对象的改变
监听器监听的是域对象,不是监听对象的某个地址
JavaEE(servlet)三大件
servlet、filter、listener
监听器的分类
监听域对象自身的创建和销毁
public class HelloListener implements HttpSessionListener, ServletRequestListener, ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContextListener.super.contextInitialized(sce);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContextListener.super.contextDestroyed(sce);
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
ServletRequestListener.super.requestDestroyed(sre);
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
ServletRequestListener.super.requestInitialized(sre);
}
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSessionListener.super.sessionCreated(se);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSessionListener.super.sessionDestroyed(se);
}
}
监听域对象中属性的增加和删除
@WebListener
public class HelloAttributeListener implements ServletContextAttributeListener, ServletRequestAttributeListener, HttpSessionAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeAdded(scae);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeRemoved(scae);
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
ServletContextAttributeListener.super.attributeReplaced(scae);
}
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeAdded(srae);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeRemoved(srae);
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
ServletRequestAttributeListener.super.attributeReplaced(srae);
}
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeAdded(se);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeRemoved(se);
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
HttpSessionAttributeListener.super.attributeReplaced(se);
}
}
监听绑定到session中的某个对象的状态的事件监听
public class HelloSessionListener implements HttpSessionActivationListener {
//在钝化之前被调用
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
HttpSessionActivationListener.super.sessionWillPassivate(se);
}
//在活化之后被调用
@Override
public void sessionDidActivate(HttpSessionEvent se) {
HttpSessionActivationListener.super.sessionDidActivate(se);
}
}
活化:从磁盘中读取session对象
钝化:向磁盘中写入session对象
@WebListener
注解加上以后才可以监听域对象
配置监听器
注解:@WebListener
xml配置:
<listener>
<listener-class>afternoon.listener.HelloListener</listener-class>
</listener>