1. Filter
- Filter功能:
- 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据
- 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据
- 过滤器在doFilter方法中执行过滤,每个过滤器都可以访问一个FilterConfig对象,从中获取初始化参数,以及一个对ServletContext的引用
- Filter仅在配置它的项目中生效
1.1 Filter使用
-
创建javax.servlet.Filter接口实现类
public class FilterImpl implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { // 统一设置请求的编码方式 req.setCharacterEncoding("UTF-8"); // 统一设置响应的编码方式(这种硬编码解决响应乱码的方式会导致下载功能出现问题) resp.setContentType("text/html;charset=UTF-8"); // 放行 chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }
-
配置该实现类的过滤路径:
-
配置文件方式:在web.xml的web-app标签里配置Filter实现类的过滤路径
<!--配置Filter实现类的信息--> <filter> <!--配置Filter名称,可以任意,但建议与类名相同--> <filter-name>FilterImpl</filter-name> <!--配置Filter类的全路径--> <filter-class>com.liu2m.filter.FilterImpl</filter-class> </filter> <!--配置Filter映射关系--> <filter-mapping> <!--配置关联的Filter名称,要和上面配置的实现类信息相对应--> <filter-name>FilterImpl</filter-name> <!--配置过滤路径:指定过滤哪些请求,可配置多个 过滤路径只能是本项目中的路径,且不用写本项目虚拟路径 绝对匹配*:/path 目录匹配:/a/b/* 扩展名匹配:*.后缀 缺省匹配:/ 除了jsp以外的都能匹配 目录匹配和扩展名匹配不能同时使用 --> <url-pattern>/</url-pattern> </filter-mapping>
-
注解方式:在该实现类上添加@WebFilter("过滤路径")
@WebFilter(urlPatterns = {"/uri1", "/uri2", "/uri3"})
-
1.2 Filter生命周期
- init方法:服务器启动时会调用init方法初始化Filter对象
- FilterConfig对象可以获取Filter的初始化参数
- doFilter方法:每次匹配过滤路径到的请求,Filter都会调用doFilter()方法进行过滤
- destroy方法:服务器正常关闭或项目从服务器移除时,会调用destory方法销毁Filter对象
1.3 过滤方式
dispatcherTypes属性值:
- DispatcherType.REQUEST:默认值,只过滤来自客户端的请求(如:浏览器直接请求、重定向、等)
- DispatcherType.FORWARD:只过滤转发的请求
- 一般情况下不过滤转发,直接使用默认值的情况偏多
@WebFilter(dispatcherTypes = {DispatcherType.FORWARD, DispatcherType.REQUEST})
1.4 过滤器链
- 过滤器链作用:一个请求可能被多个过滤器所过滤,只有当所有过滤器都放行,请求才能到达目标资源,如果有某一个过滤器没有放行,那么请求就无法到达后续过滤器以及目标资源
- 过滤器链执行顺序:
- 配置文件:按照配置文件中filter-mapping的书写顺序执行
- 注解方式:按照Filter类名的首字母顺序执行
2. Listener
JavaWeb中的监听器可以监听域对象的状态,事件源和监听器的绑定通过配置web.xml完成
2.1 Listener使用
创建监听器接口实现类
-
绑定事件源和监听器:
-
在web.xml的web-app标签里绑定:
<listener> <!--配置监听器的全路径--> <listener-class>com.liu2m.listener.SclImpl</listener-class> </listener>
注解方式绑定:在实现类上添加@WebListener
-
事件对象(如:servletContextEvent),可以获取事件源(如:ServletContext)
2.2 常用监听器
- ServletContextListener监听器可以监听ServletContext域对象的创建和销毁,即可以监听服务器的启动和关闭*
- contextInitialized方法在ServletContext域对象创建时执行
- contextDestroyed方法在ServletContext域对象销毁时执行
- ServletContextAttributeListener监听器可以监听:
- attributeAdded方法在属性添加到ServletContext中时执行
- attributeRemoved方法在属性从ServletContext中移除时执行
- attributeReplaced方法在属性从ServletContext中被替换时执行
- HttpSessionListener监听器可以监听HttpSession域对象的创建和销毁