一、Filter
1.1、概念
当访问服务器资源的时候,过滤器可以将请求拦截下来,完成一些特殊的功能
1.2、过滤器的作用
1、登录验证
2、统一编码处理
3、敏感字符处理
1.3、快速入门
步骤:
1、定义一个类实现接口Filter
2、复写方法
3、配置拦截路径
web.xml配置
注解配置
1.4、过滤器的细节
1.4.1、web.xml配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>全类名</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
1.4.2、过滤器执行流程
1、执行过滤器
2、执行放行后的资源
3、回来执行过滤器放行代码下边的代码
1.4.3、过滤器生命周期方法
- init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
- doFilter:每一次请求被拦截资源时,会执行。执行多次
- destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
1.4.4、过滤器配置详解
拦截路径配置
:
1、具体资源路径:
/index.jsp
只有访问index.jsp资源时,过滤器才会被执行2、拦截目录:
/user/*
访问/user下的所有资源时,过滤器都会被执行3、后缀名拦截:
*.jsp
访问所有后缀名为jsp资源时,过滤器都会被执行*4、拦截所有资源:
/*
访问所有资源时,过滤器都会被执行
拦截方式配置
:资源被访问的方式
注解配置:
设置dispatcherTypes属性
- REQUEST:默认值。浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
web.xml配置
设置<dispatcher></dispatcher>
标签即可
1.4.5、过滤器链(配置多个过滤器)
执行顺序:如果有两个过滤器:过滤器1和过滤器2
1. 过滤器1
2. 过滤器2
3. 资源执行
4. 过滤器2
5. 过滤器1
过滤器先后顺序问题:
1、注解配置:按照类名的字符串比较规则比较,值小的先执行
如: AFilter 和 BFilter,AFilter就先执行了。
2、web.xml配置:<filter-mapping>
谁定义在上边,谁先执行
1.5、案例1 登录验证
访问项目的时候 验证是否登录
如果登录了则直接放行
如果没有登录则跳转到登录页面 并给出提示信息
package com.zhou.test.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
// 1、将request强转为httpServletRequest
HttpServletRequest request1 = (HttpServletRequest) request;
// 2、获取请求路径
String uri = request1.getRequestURI();
// 3、判断是否包含登录相关的资源
if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet")){
// 包含 用户就是想登录 放行
chain.doFilter(request,response);
}else {
// 不包含 需要验证用户是否登录
// 从session中获取flag
String flag = (String) request1.getSession().getAttribute("flag");
if ("true".equals(flag)){
// 登陆了 放行
chain.doFilter(request,response);
}else {
// 没有登录 跳转到登录页面
request1.setAttribute("login_msg","您尚未登录,请先登录!");
request1.getRequestDispatcher("/login.jsp").forward(request1,response);
}
}
}
}
二、Listener
2.1、概念
web的三大组件之一
事件监听机制
事件:一件事情·
事件源:事件发生的地方
监听器:一个对象
注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
2.2、常用的监听对象
ServletContextListener
:监听ServletContext对象的创建和销毁
方法:
void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
2.3、快速入门
步骤;
1、定义一个类实现ServletContextListener接口
2、复写方法
3、配置web.xml
- web.xml
cn.itcast.web.listener.ContextLoaderListener
指定初始化参数- 注解:
@WebListener
类实现ServletContextListener接口
2、复写方法
3、配置web.xml
- web.xml
cn.itcast.web.listener.ContextLoaderListener
指定初始化参数- 注解:
@WebListener