过滤器(实现原理:函数回调)
1. 什么是过滤器?
过滤你的请求,前端请求过来之后,首先走到过滤器,过滤器进行过滤之后再往后走。在服务器启动的时候,过滤器就启动了,init()被调用,filter先于Servlet执行 ,servlet的初始化方法是在你请求servlet的时候才被初始化。
2.过滤器的作用:Filter—过滤字符集,可以解决我们的乱码问题
3.Filter(接口)-----通过类去实现它,并且实现他的方法
- a.doFilter():拦截你的请求,放行到下边走
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器的拦截方法...");
chain.doFilter(req, resp);
}
- b.init():初始化方法,比servlet走的早。
package com.wmx;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FilterSer extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("进入servelt的post方法");
}
public void init() throws ServletException {
System.out.println("servlet的初始化方法");
};
}
package com.wmx;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Filter01 implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("已经完成过滤....");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
System.out.println("这是一个过滤器的拦截方法");
//过滤器的放行方法
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("进入过滤器的初始化方法.......");
}
}
运行结果:filter在服务器启动的时候就已经开始加载,而servlet要在请求之后才进行加载
c.destroy()方法:过滤器的销毁。一般的释放资源都在这个里。
4.过滤器的处理方式如下图所示
监听器(实现原理:观察者模式)
- Listener (监听器):我们在 web.xml 中配置 listener 的时候就是把一个被观察者放入的观察者的观察对象队列中,当被观察者触发了注册事件时观察者作出相应的反应。在 jsp/servlet 中具体的实现是在 web.xml 中注册 Listener 。
- servlet 中有主要有 3 类事件: Servlet 上下文事件、会话事件与请求事件总共有 8 个 listener 接口,我们在 web.xml 中注册时对应上自己对相应接口的实现类即可:
- 在 JSP 2.0/Servlet 2.4 中,共有八个 Listener 接口,六个 Event 类别。
- ServletContextListener 接口
[ 接口方法 ] contextInitialized() 与 contextDestroyed()
[ 接收事件 ] ServletContextEvent
[ 触发场景 ] 在 Container 加载 Web 应用程序时(例如启动 Container 之后),会呼叫 contextInitialized() ,而当容器移除 Web 应用程序时,会呼叫 contextDestroyed () 方法。 - HttpSessionListener
[ 接口方法 ] sessionCreated() 与 sessionDestroyed ()
[ 接收事件 ] HttpSessionEvent
[ 触发场景 ] 在 session ( HttpSession )对象建立或被消灭时,会分别呼叫这两个方法。 - ServletRequestListener
[ 接口方法 ] requestInitialized() 与 requestDestroyed()
[ 接收事件 ] RequestEvent
[ 触发场景 ] 在 request ( HttpServletRequest )对象建立或被消灭时,会分别呼叫这两个方法。 - 监听器是指专门用于在其他对象身上发生的事件或者状态改变进行监听和相应处理的对象,当被监听的对象发生变化时立即采取相应的行动。
- Web监听器是Servlet规范定义的特殊类,可以监听客户端的请求和服务端的操作。监听的对象有:ServletContext、HttpSession、ServletRequest分别对应JSP9大内置对象中的application、session和request。用于监听ServletContext、HttpSession、ServletRequest等域对象的创建和销毁事件,监听域对象属性发生修改的事件。监听器对象可以在事件发生前、发生后做一些必要的处理。
监听器的实现
- 创建一个类实现监听器接口(ServletRequestListener、ServletContextListener、HttpSessionListener);
- 在web.xml中注册该监听器(配置非常简单只需要在web.xml中指定监听器所在的类名即可)
<listener>
<listener-class>listener.FirstListener</listener-class>
</listener>
监听器的启动顺序:
在一个web.xml中可以注册多个Servlet监听器,监听器的加载顺序是按照web.xml文件中的顺序加载的。
如果我们在web.xml文件中同时配置了监听器、过滤器和Servlet,那么它们的优先级是:
- ServletContextListener
这个监听器的主要用途是做一些定时器、加载一些全局属性对象、创建全局的数据库连接、加载一些缓存信息。
package listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class FirstListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent servletContextEvent) {
String initParam = servletContextEvent.getServletContext().getInitParameter("initParam");
// 可以在这里通过Servlet的setAttribute()方法设置全局的属性对象,从其他地方可以获取到这个属性对象
servletContextEvent.getServletContext().setAttribute("name", "object");
System.out.println("===========contextInitialized,initParam = " + initParam);
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("=================contextDestroyed================");
// 可以在这里关闭数据库连接
}
}
配制web.xml文件
<listener>
<listener-class>listener.FirstListener</listener-class>
</listener>
<!-- Servlet的初始化参数 -->
<context-param>
<param-name>initParam</param-name>
<param-value>123456</param-value>
-
HttpSessionListener
该监听器的主要作用是统计在线人数、记录访问日志【在后台统计访问时间、IP信息做一些统计数据】package listener;
import java.util.Date;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;public class MyHttpSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent httpSessionEvent) { System.out.println("===================================="); System.out.println("session创建于" + new Date()); } public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { System.out.println("===================================="); System.out.println("session销毁于" + new Date()); }
}
<listener>
<listener-class>listener.MyHttpSessionListener</listener-class>
</listener>
<!-- 配置session的超时为1min -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>