1_过滤器简介
服务端多了一类JAVA代码,职责主要是起过滤作用
应用场景:判断用户是否登录,过滤非法字符,解决全站乱码
2_过滤器入门
class FilterDemo01 implements Filter{
init(){}
destroy(){}
doFilter(request,response,chain){
通过request/response实现代码
}
}
xml方式实现配置:
<!–为FilterDemo01实现配置
通过url-pattern配置,当我们想服务端发起
localhost:8080/test/servletDemo01
localhost:8080/test/demo01/demo01.jsp
都会经过过滤器
如果过滤器的路径配置为 "/*" ,只要请求当前项目下的任意请求,都会经过过滤器
–>
<filter>
<filter-name>FilterDemo01</filter-name>
<filter-class>cn.itcast.web.filters.FilterDemo01</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo01</filter-name>
<url-pattern>/servletDemo01</url-pattern>
<url-pattern>/demo01/demo01.jsp</url-pattern>
</filter-mapping>
利用注解的方式实现过滤器的配置
FilterDemo02.java
//@WebFilter(filterName = "FilterDemo02",urlPatterns = "/*")
//@WebFilter(filterName = "IllegalFilter",urlPatterns={"/AAServletDemo","/IllegalServlet","*.jsp"})
public class FilterDemo02 implements Filter {}
*_过滤器的执行流程
#_服务器启动,启动的时候将系统下配置好的所有的过滤器都要创建
#_从客户端发起一个请求
#_tomcat接受到本次请求,将HTTP协议请求部分封装到request对象上,
同时将response创建好
#_tomcat分析本次请求的路径是否和系统中已经创建好的过滤器的路径是否匹配
如果发现系统中存在和当前的请求路径匹配的过滤器,执行过滤器的doFilter方法
将创建好的request,response传递给doFilter
#_执行doFilter方法的时候,
如果碰到chain.doFilter(req, resp); 代表放行放行之后继续执行目标资源(demo01.jsp/servletDemo01)
如果没有执行chain.doFilter(req, resp);,本次请求将不会调用目标资源,tomcat继续进行响应
#_tomcat调用目标资源 servletDemo01/demo01.jsp/demo.html
#_目标资源执行完毕之后,回到过滤器中继续执行放行之后的语句
#_tomcat获取到resopnse完成本次响应
*_过滤器的生命周期
#_服务器启动就将配置好的过滤器,从硬盘将过滤器对应的字节码加载到内存
调用过滤器中的无参数的构造函数创建过滤器对象,执行过滤器中init方法
#_每次请求到达服务端的时候,tomcat分析本次的请求路径是否和系统中已经存在的过滤器
的路径匹配,如果匹配,执行过滤器下的doFilter();
每次请求到达服务端,只要路径匹配,都会执行过滤器下的doFiter方法
#_服务器正常停止,执行过滤器下的destroy方法
*_过滤器的路径配置
代码详见FilterDemo03
//@WebFilter(filterName = "FilterDemo03",urlPatterns = "/servletDemo01")
//@WebFilter(filterName = "FilterDemo03",urlPatterns = "/demo01/demo01.jsp")
//@WebFilter(filterName = "FilterDemo03",urlPatterns = "/*") 普通
//@WebFilter(filterName = "FilterDemo03",urlPatterns = "/download/*") 重要
//@WebFilter(filterName = "FilterDemo03",urlPatterns = "*.html") 重要
*_过滤器的拦截方式
注解方式
@WebFilter(filterName = "FilterDemo04",urlPatterns = "/demo01/demo02.jsp",dispatcherTypes =DispatcherType.FORWARD)
@WebFilter(filterName = "FilterDemo04",urlPatterns = "/demo01/demo02.jsp", dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
xml方式:
<filter>
<filter-name>FilterDemo04</filter-name>
<filter-class>cn.itcast.web.filters.FilterDemo04</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo04</filter-name>
<url-pattern>/demo01/demo02.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
项目后期遇到的共同问题:
性能(生命周期),高扩展(Filter),监听()
*_监听器
什么是监听器?
JavaWeb服务端多了一类程序,这类程序有个特点:监听到域对象的创建和销毁,主要起监听的作用
一_监听域对象的创建和销毁
监听session的创建和销毁粗略的估计某段时间内系统的用户访问量
监听request的创建和销毁:粗略估计某段时间内系统的访问压力
监听ServletContext的创建和销毁
二_监听域对象的属性变更
*.setAttribute("name","aaa"); //存入
*.setAttribute("name","bbb"); //替换
*.removeAttribute("name"); //移除
ServletContext/session/request
三_Session域对象JavaBean对象状态变更
将一个javaBean对象绑定在session
将一个javaBean对象从session中移除
JavaBean对象序列化到硬盘 钝化
JavaBean对象从硬盘加载到内存 活化
代码:
class AAA implements SevletContextListener{
public void contextInitialized(ServletContextEvent sce) {
//监听到ServletContext的创建
System.out.println("ServletContext正在被创建");
//获取到ServletContext
sce.getServletContext();
//读取自己的配置文件,将配置数据读取到之后,存入到ServletContext中map
//spring后期配置一个监听器,服务器启动的时候,将spring配置文件中的数据读到map
}
public void contextDestroyed(ServletContextEvent sce) {
//监听到ServletContext的销毁
System.out.println("ServletContext正在被销毁");
}
}
//监听到session/request创建和销毁
//监听到Servletcontext域对象的属性变更
项目后期遇到的共同问题:
性能(生命周期),高扩展(Filter),监听()
监听:运维人员配合工具:对这个系统进行监听 : 网络峰值,硬件使用情况
开发阶段:设计一些代码起到监听作用