Filter
- 用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理
- 在服务器启动时创建 Filter 实例并执行初始化,创建或销毁顺序由在 web.xml 中配置的
的先后顺序决定 - 过滤器链:过滤顺序由在 web.xml 中配置的
的先后顺序决定
创建 Filter 的步骤
创建 Filter 类,实现 javax. servlet.Filter 接口,该接口中的方法
void init(FilterConfig config)
:用于完成 Filter 的初始化void destroy()
:用于 Filter 销毁前,完成某些资源的回收void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
:实现过滤功能,该方法就是对每个请求及响应增加的额外处理- doFilter() 方法可实现对用户请求进行预处理,也可实现对服务器响应进行后处理——它们的分界线为是否调用了
chain.doFilter(request, response);
,执行该方法之前,即对用户请求进行预处理,行该方法之后,即对服务器响应进行后处理
- doFilter() 方法可实现对用户请求进行预处理,也可实现对服务器响应进行后处理——它们的分界线为是否调用了
通过注解或在 web.xml 文件中配置 Filter
- 在 web.xml 文件中配置 Filter
,定义 Filter ,Filter 的名字 ,Filter 的实现类 ,为该 Filter 配置参数,子标签 、
,定义 Filter 拦截的 URL 地址 ,Filter 的名字 ,Filter 负责拦截的 URL,可以有多个 ,对指定的 Servlet 过滤 ,指定 Filter 所拦截的资源被 Servlet 容器调用的方式,内容可以为:REQUEST、FORWARD、INCLUDE、ERROR、ASYNC 之一(默认情况下,Filter 只会对新的请求做拦截 REQUEST,如果是请求转发,则不会过滤)
- 使用 @WebFilter 注解,支持的常用属性
- filterName,指定该 Filter 的名称
- initParams,用于为该 Filter 配置参数
- servletNames,该属性值可指定多个 Servlet 的名称,用于指定该 Filter 仅对这几个 Servlet 执行过滤
- urIPatterns/value,这两个属性的作用完全相同,都指定该 Filter 所拦截的 URL
- 在 web.xml 文件中配置 Filter
应用
// 1. 请求编码过滤器 CharacterEncodingFilter
if (hasLength(encoding) && (req.getCharacterEncoding() == null || forceEncoding)) {
req.setCharacterEncoding(encoding);
}
// 2. 登录验证过滤器 CheckLoginFilter
// 对于需要过滤的资源,放在统一的目录下,如 @WebFilter("/checklogin/*")
if (user == null) {
resp.sendRedirect("/login.jsp");
return;
}
// 3. 屏蔽敏感字过滤器 ContentFilter
// 自定义 MessageFilterRequest 继承HttpServletRequestWrapper 覆盖 getParameter 方法
MessageFilterRequest req = new MessageFilterRequest((HttpServletRequest) request);
// 4. 做 MVC 框架的前端控制器(处理请求、进行分发)
Listener
- 作用:监听 Web 应用的内部事件
使用 Listener 的步骤
定义 Listener 实现类,常用的 Listener 接口有:ServletContextListener:用于监听 Web 应用的启动和关闭ServletContextAttributeListener:用于监听 application 内属性的改变(被添加、删除、替换)ServletRequestListener:用于监听用户请求的初始化和销毁ServletRequestAttributeListener:用于监听 request 内属性的改变(被添加、删除、替换)HttpSessionListener:用于监听 session 的创建和销毁(可以通过该监听器监听系统的在线用户)HttpSessionAttributeListener:用于监听 session 内属性的改变(被添加、删除、替换)
通过注解或在 web.xml 文件中配置 Listemer
- 使用 @WebListener 修饰 Listener 实现类,无须指定任何属性
- 在
标签中增加子标签 ,指定 Listener 的实现类