一.Filter过滤器
1.1 Filter基本概念
Filter本意为”过滤“的含义,是JavaWeb的三大组件之一,三大组件为:Servlet、Filter、 Listener。
过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件。
过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求 进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等。
1.2 工作方式:
1.3 定义方式:
chain.doFilter(request,response)相当于放行.
配置Filter在web.xml文件中
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.lagou.demo01.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/main.jsp</url-pattern>
</filter-mapping>
1.4 Filter接口
javax.servlet.Filter接口主要用于描述过滤器对象,可以对资源的请求和资源的响应操作进行筛选操作。
常用方法:
1.5 FilterConfig接口
javax.servlet.FilterConfig接口主要用于描述过滤器的配置信息。
常用方法:
getFilterName 获取过滤器名称:
System.out.println("获取到的过滤器名称为:" + filterConfig.getFilterName());
getInitParametr(String name) 获取初始化参数信息:
String userName = filterConfig.getInitParameter("userName");
Enumeration getInitParameterNames获取初始化操作名称(如果数据很多):
while (initParameterNames.hasMoreElements()) {
// userName password
System.out.println("获取到的初始化参数名为:" + initParameterNames.nextElement());
}
getServletContext 获取ServletContext对象:
ServletContext servletContext = filterConfig.getServletContext();
System.out.println("获取到的上下文对象是:" + servletContext);
1.6 多个过滤器的使用
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是第一道防线!");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("第一道防线返回!");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是第二道防线!");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("第二道防线返回!");
}
在web.xml配置文件中我们配置了两个过滤器的映射,B过滤器在前.
我们运行一下:
根据后台的回馈可以看出b过滤器在a过滤器之前被调用。
1.7 过滤器优点
实现代码的“可插拔性”,即增加或减少某个功能模块,不会影响程序的正常执行。
可以将多个相同处理逻辑的模块集中写在过滤器里面,可实现重复利用、也方便代码的维护。
1.8 用过滤器解决登陆问题:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 1.实现对用户访问主页面的过滤操作,也就是只有用户登录后才能访问主页面,否则一律拦截
// 判断session中是否已有用户名信息,若没有则进行拦截,否则放行
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
HttpSession session = httpServletRequest.getSession();
Object userName = session.getAttribute("userName");
// 获取Servlet的请求路径
String servletPath = httpServletRequest.getServletPath();
// 若没有登录,则回到登录页面
if (null == userName && !servletPath.contains("login")) {
servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
} else {
// 若已经登录,则放行
filterChain.doFilter(servletRequest, servletResponse);
}
}
二.Listener监听器
2.1 基本概念
Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。
容器产生的事件分类如下:
生命周期相关的事件。
属性状态相关的事件。
存值状态相关的事件。
底层原理是采用接口回调的方式实现。
2.2 基本分类
2.3 监听器详解
1 ServletRequestListener监听器
2 ServletRequestAttributeListener监听器
3 HttpSessionListener监听器
4 HttpSessionAttributeListener监听器
5 ServletContextListener监听器
6 ServletContextAttributeListener监听器
7 HttpSessionBindingListener监听器
8 HttpSessionActivationListener监听器
钝化:把数据从内存取出来放入硬盘。
活化:把数据从硬盘取出来放入内存。