Servlet Filter Listener是JavaWeb的三大组件。
Filter
Servlet Filter Listener是JavaWeb的三大组件。
过滤器一般用于完成通用的操作,如:登录验证、统一编码、敏感字符过滤等
过滤器执行流程:
- 客户端请求资源-》对request过滤-》访问资源-》对response过滤-》返给客户端。
快速入门
和定义一个servlet相似:
- 定义一个类,实现接口Filter
- 重写方法
- 配置拦截路径
@WebFilter("/*")
(对所有路径过滤) - 放行所有内容:doFilter方法中代码如下:
filterChain.doFilter(servletRequest, servletResponse);
过滤器配置
拦截路径配置:
- 具体资源路径:
@WebFilter(/index.jsp)
- 目录拦截:
@WebFilter(/user/*)
- 后缀名拦截:
@WebFilter(*.jsp)
- 拦截所有资源:
@WebFilter(/*)
拦截方式配置:(设置dispatcherTypes属性)
- REQUEST: 默认值,浏览器直接请求资源时,拦截过滤
- FORWARD: 转发访问资源时,拦截过滤
- INCLUDE: 包含访问资源(不讲)
- ERROR: 错误跳转资源(不讲)
- ASYNC: 异步访问资源 (先不讲,涉及到Ajax)
还可以拦截多个请求方式:
@WebFilter(value="/*",dispatcherTypes={DispatcherTypes.REQUEST, DispatcherTypes.FORWARD})
过滤器链
如果有多个过滤器,访问资源前,按顺序过滤;访问资源后,按相反顺序过滤。
过滤顺序可以进行配置:
- 注解配置方式:按照类名的字符串比较,值小的先执行
- web.xml配置方式
<filter-mapping></filter-mapping>
谁定义在上面,谁先执行
例1:登录
如果用户登录,直接放行;如果没有,跳转到登录页面。
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 转成HttpServlet
HttpServletRequest req = (HttpServletRequest) servletRequest;
// 获取资源请求路径
String uri = req.getRequestURI();
// 判断是否包含登陆相关资源:js,css,图片等
if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/")
|| uri.contains("/js/") || uri.contains("/fonts/")) {
// 如果正在登陆,直接放行
filterChain.doFilter(servletRequest, servletResponse);
} else {
// 访问的是非登陆资源,判断是否已经登陆
Object user = req.getSession().getAttribute("user");
if (user != null) {
// 已经登陆, 直接放行
filterChain.doFilter(servletRequest, servletResponse);
} else {
req.setAttribute("login_msg", "请先登陆");
req.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
}
}
}
Listener
(理论了解即可)
Servlet Filter Listener是JavaWeb的三大组件。
事件监听机制:
- 事件:一件事情(如:单击、双击)
- 事件源:事件发生的地方(如:按钮、鼠标、键盘)
- 监听器:一个对象
- 注册监听:将事件、事件源、监听器绑定在一起。
JavaWeb中有很多监听器对象,学习其中一个:ServletContextListener
ServletContextListener:监听ServletContext对象的创建和销毁
- void contextDestroyed: ServletContextListener对象被销毁前调用该方法
- void contextInitialized: ServletContextListener对象被创建后调用该方法
实现步骤:
- 定义一个类,继承ServletContextListener类;
- 重写上面的两个方法;(如,创建对象后,加载项目全局的配置文件)
- 添加注解
@WebListener