目录
Filter
Tomcat中的过滤器:当访问服务器的资源时,过滤器可以将请求Servlet之前拦截下来,完成一些特殊的功能。
一般用于完成通过的操作。如:登录验证,统一编码处理,敏感字符过滤..
过滤器执行流程
1:执行过滤器
2:执行放行后的资源
3:回来执行过滤器放行后的代码执行
Filter使用
定义一个类,实现接口Filter
②:复写方法
③:配置拦截路径
web.xml
<filter> <filter-name>myfilter</filter-name> <filter-class>com.rocky.Filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myfilter</filter-name> <!-- 配置的是拦截的路径--> <url-pattern>/*</url-pattern> </filter-mapping>
注解方式
/** * 过滤器快速入门 * */ @WebFilter("/*") //访问所有servlet之前都会经过这个过滤器 public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("MyFilter执行了......"); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
Filter过滤器细节
1过滤器生命周期
init:在服务器启动后,会创建Filter对象,然后调用Init方法。只执行一次。用于加载资源。
doFilter:在每一次请求被拦截资源时,会执行。执行多次。
destroy:服务器正常关闭前,被销毁destroy 只执行一次
2过滤器配置讲解
拦截路径的配置
1:拦截资源路径:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
2:目录拦截:/user/* 访问/user下的所有资源时,过滤器都会被执行
3:后缀名拦截:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
4:拦截所有资源:/* 访问所有资源时,过滤器都会被执行
拦截方式的配置:资源被访问的方式
1:Request:默认值。浏览器直接请求资源。
2:FORWARD:转发包含资源
3:INCLUDE:包含访问资源
4:ERROR:错误跳转资源
5:ASYNVC:异步访问资源
3过滤器链(配置多个过滤器)
执行顺序:如果有两个过滤器:过滤器1和过滤器2
1:过滤器1
2:过滤器2
3:资源执行
4:过滤器2
5:过滤器1
过滤器先后顺序问题:
1:注解配置:按照类名和字符串比较规则比较,值小的先执行
如:AFilter和BFilter,AFilter就先执行了。
2:web.xml配置:<filter-mapping>谁定义在上边,谁先执行
监听器
概念:Web的三大组件之一。
事件监听机制
事件:一件事情
事件源:事件发生的地方
监听器:一个对象
注册监听:将事件,事件源,监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
ServletContextListener:监听ServletContext对象的创建和销毁
void contextDestroyed(ServletContextEvent servletContextEvent):ServletContext对象被销毁之前会调用该方法
void contextInitialized(ServletContextEvent servletContextEvent):ServletContext对象创建后会调用该方法
监听器使用
步骤:
1:定义一个类,实现ServletContextListener接口
2:复写方法
public class MyContextConfigListener implements ServletContextListener { /* * 服务器一启动就执行Initial方法 这个方法是整个web最先执行的 * sce 就是全局对象 servletContext * */ @Override public void contextInitialized(ServletContextEvent sce) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); ServletContext servletContext = sce.getServletContext(); servletContext.setAttribute("applicationContext",applicationContext); }
ServletContext
两种获取方式
ServletContext servletContext = req.getServletContext();
ServletContext servletContext = this.getServletContext();