一、Filter
1.Filter概述
过滤器可以在访问到资源之前将请求拦截下来,也就是说在访问资源之前会先经过 Filter,从而实现一些特殊的功能。
过滤器能实现哪些通用功能
1. 比如每个资源都要写一些代码完成某个功能,可以将这些代码写在过滤器中,因为请求每一个资源都要经过过滤器。
2.实现用户登录才可以访问登录后的资源,没登录就跳转到登录界面,登录后才可以访问资源。
可以将这个代码写在过滤器中,来判断用户是否登录,这个就是**权限控制**。
3.过滤器还可以做 统一编码处理、 敏感字符处理 等...
2.Filter开发步骤
Filter开发分为三步:
1. 定义类,实现 Filter接口,并重写其所有方法
2. 配置Filter拦截资源的路径:在类上定义 @WebFilter 注解。而注解的 value 属性值 /* 表示拦截所有的资源
3. 在doFilter方法中输出一句话,并放行
chain.doFilter(request,response);就是放行的意思,让请求访问到想要访问的资源。
3.Filter执行流程
Filter的执行流程:
总结:
对请求进行处理的代码放在放行之前进行处理
对请求完成后的响应数据在放行之后进行处理。
4.Filter拦截路径配置
拦截路径表示 Filter 会对请求的哪些资源进行拦截,使用@WebFilter("拦截路径")注解来实现。
拦截路径有如下四种配置方式:
1. 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
2. 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
3. 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
4. 拦截所有:/*:访问所有资源,都会被拦截
5.过滤器链
过滤器链是指在一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。
上图的执行流程:
1. 执行 Filter1 的放行前逻辑代码
2. 执行 Filter1 的放行代码
3. 执行 Filter2 的放行前逻辑代码
4. 执行 Filter2 的放行代码
5. 访问到资源
6. 执行 Filter2 的放行后逻辑代码
7. 执行 Filter1 的放行后逻辑代码
注意:注解配置Filter的优先级是按照过滤器类名(字符串)的自然排序。
比如:两个名称的过滤器 : BFilterDemo 和 AFilterDemo 。那一定是 AFilterDemo 过滤器先执行。
因为英文字母中,A是排在前面的。
6.过滤器中要注意的问题
因为过滤器会拦截所有的资源请求,那么对于静态资源的请求,我们如果也进行拦截了,那在登录页面,所需要的一些CSS样式文件也会被拦截,被拦截后就无法正常显示效果了。
所以,我们需要在过滤器中忽略静态资源请求的拦截。
核心代码如下:
HttpServletRequest req = (HttpServletRequest) request;
//判断访问资源路径是否和登录注册相关
//1,在数组中存储登陆和注册相关的资源路径
String[] urls =
{"/login.jsp",
"/imgs/",
"/css/",
"/loginServlet",
"/register.jsp",
"/registerServlet",
"/checkCodeServlet"};
//2,获取当前访问的资源路径
String url = req.getRequestURL().toString();
//3,遍历数组,获取到每一个需要放行的资源路径
for (String u : urls) {
//4,判断当前访问的资源路径字符串是否包含要放行的的资源路径字符串
/*
比如当前访问的资源路径是 /brand-demo/login.jsp
而字符串 /brand-demo/login.jsp 包含了 字符串 /login.jsp ,所以这个字符串就需要放行
*/
if(url.contains(u)){
//找到了,放行
chain.doFilter(request, response);
//break;
return;
}
}
二、Listener
1.Listener概述
Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
监听器可以监听就是在 application , session , request 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
application 是 ServletContext 类型的对象。
ServletContext 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。
2.Listener分类
JavaWeb 提供了8个监听器:
ServletContextListener 接口中有以下两个方法:
void contextInitialized(ServletContextEvent sce) : ServletContext 对象被创建了会自动执行的方法
void contextDestroyed(ServletContextEvent sce) : ServletContext 对象被销毁时会自动执行的方法
3.ServletContextListener 监听器演示
1.定义一个类,实现 ServletContextListener 接口
2.重写所有的抽象方法
3.使用 @WebListener 进行配置
启动服务器,就可以在启动的日志信息中看到 contextInitialized() 方法输出的内容,
同时也说明了 ServletContext对象在服务器启动的时候被创建了