一、Filter过滤器
1、概念
生活中有哪些过滤器呢?————净水器、空气净化器
web中的过滤器:当访问服务器的资源时,过滤器可以请求拦截下来,完成一些特殊功能。
常用的场景:登录验证、统一编码处理、敏感字符过滤等等。
2、步骤
我们先来简要写一下,首先定义一个类实现接口Filter,其次重写方法,最后配置拦截路径
@WebFilter("/*") //访问所有资源之前,都会执行该过滤器
public class FilterTest implements Filter {
@Override
public void init(FilterConfig filterconfig) throws ServletException {
System.out.println("初始化Filter");
}
@Override
public void doFilter(ServletRequest req,ServletResponse res,FilterChain fc) throws IOException ,
ServletException {
System.out.println("执行ing...");
//放行
fc.doFilter(rep,res);
System.out.println("返回执行doFilter方法");
}
@Override
public void destroy() {
System.out.println("go die~");
}
}
3、很重要的细节问题
①web.xml配置
<filter>
<!-- 过滤器内部名称 -->
<filter-name>FilterTest</filter-name>
<!-- 过滤器类的全名 -->
<filter-class>wzm.web.filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<!-- 过滤器内部名称 -->
<filter-name>FilterTest</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
②过滤器执行流程
a.执行过滤器
b.执行放行后的资源
c.回来执行过滤器放行代码下的代码
③过滤器的生命周期
a.init:在服务器启动后,创建Filter对象,调用init方法,只执行一次,用于加载资源
b.doFilter:每一次请求被拦截资源时,执行。执行多次。
c.destroy:在服务器关闭后,销毁Filter对象,若服务器正常关闭,执行destroy方法,执行一次,释放资源。
④过滤器配置详情
a.拦截路径配置:
(一)具体资源路径:/index.jsp ,只有访问index.jsp资源时,过滤器才会执行。
(二)拦截目录:/user/* ,访问/user下的所有资源时,过滤器才会执行。
(三)后缀名拦截:*.jsp,访问后缀名有jsp的资源时,过滤器才会执行。
(四)拦截所有资源:/* ,访问所有资源时,过滤器都会执行。
b.拦截方式配置
(一)注解配置
设置dispatcherTypes属性
REQUEST:默认值,浏览器直接请求资源
FORWARD:转发访问资源
INCLUDE:包含访问资源
ERROR:错误跳转资源
ASYNC:异步访问资源
(二)web.xml配置
设置dispatcher 、 /dispatcher标签即可
⑤过滤器执行的先后顺序问题
(一)注解配置:按照类名的字符串比较规则比较,值小的先执行 * 如: AFilter 和 BFilter,AFilter就先执行了。
(二) web.xml配置: filter-mapping 谁定义在上边,谁先执行
4、来个案例
解决全站乱码问题,处理所有的请求
import...
public class CharacterFilter implements Filter{
public void init (FilterConfig filterconfig) throws ServletException {
}
public void doFilter(ServletRequest req,ServletResponse res,FilterChain fc) throws IOException
,ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String method = request.getMethod();
//解决post请求中文数据乱码问题
if(method.equalsIgnoreCase("post")) {
request.setCharacterEncoding("utf-8");
}
//处理响应乱码
response.setContentType("text/html;charset=utf-8");
fc.doFilter(request,response);
}
public void destroy() {
}
}
二、Listener监听器
1、概念
web的三大组件之一
事件监听机制 ——
事件:一件事情
事件源:事件发生的地方
监听器:一个对象
注册监听:将以上三者绑定在一起,当事件源上发生某个事件后,执行监听器代码。
2、方法
ServletContextListener:监听ServletContext对象的创建和销毁
①void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
②void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
3、步骤
①定义类,实现ServletContextListener接口
②重新方法
③配置
(一) web.xml
<listener>
<listener-class>wzm.web.listener.ContextLoaderListener</listener-class>
</listener>