简单了解javaweb三大件
javaweb三大件
上面说过javaweb的内存马有三种,servlet、filter、listener
所以javaweb三大件就是servlet、filter、listener
servlet
servlet是一个运行在web上的程序,处在一个中间层的位置(在http客户端的请求和http上的数据库或者应用程序之间)。
servlet对请求的处理过程如下:
- 客户端发送http请求,比如一个get/post请求等
- servlet接收请求,并且根据请求的信息封装成
HttpServletRequest
和HttpServletResponse
对象 - servlet调用
init()
方法,init()
只在第一次请求时被调用 - servlet调用
service()
方法 - servlet根据请求类型调用相应的
doxxx()
方法,比如get型就调用doGet()
,该doxxx方法内写的就是我们自己的业务逻辑 - 处理完成后,将结果返回servlet,然后再由servlet返回给客户端
- 调用destory方法
servlet的生命周期:
- 服务器启动(web.xml中配置load-on-startup=1,默认为0)或者第一次请求servlet的时候,调用
init()
- servlet处理请求,调用
service(ServletRequest req, ServletResponse res)
- 关闭时,调用
destory
方法销毁这个servlet对象 - jvm进行垃圾回收
filter
filter称为过滤器,是对servlet技术的一个强补充。在HttpServletRequest
到达servlet之前,拦截下这个对象,然后检查该对象或者修改其中的Request头和数据。同样地,在HttpServletResponse
到达客户端之前拦截下这个对象,然后检查该对象或者修改HttpServletResponse
头和数据
简单点说就是filter就像是一个保安,分别拦截Request和Response对象,然后根据需要对其进行检查和修改再放行
filter的工作原理
- filter程序是一个实现了特殊接口的java类,和servlet类似。由servlet容器进行调用和执行
- 在web.xml注册了一个filter来对某个servlet进行拦截处理的时候,filter可以决定是否将请求继续传递给servlet程序,还可以对请求进行修改
- 当servlet容器开始调用某个servlet程序的时候,如果发现了它已经注册了一个filter程序对servlet进行拦截的时候,容器就不会再直接调用
service()
方法,而是先调用doFilter()
方法,然后再由doFilter()
方法决定是否去执行service()
方法 - 一些细节就是在
doFilter
里也不是由doFilter
直接调用service
方法,而是调用FilterChain.doFilter
方法来调用service
方法。而FilterChain
对象是通过Filter.doFilter
方法的参数传递进来的 - 只要在调用
FilterChain.doFilter
方法前后增加某些程序代码,就可以在servlet进行相应前后实现某些特殊功能 - 如果
Filter.doFilter
方法没有调用到FilterChain.doFilter
方法的话,就不会调用service
方法,这样通过filter就可以阻止某些非法的访问请求
filter的生命周期
与servlet一致,filter的创建与销毁由容器负责
- web应用启动时,创建filter对象,并调用其init方法,读取web.xml,完成对象的初始功能,为拦截做好准备工作,其中filter和init方法都只会执行一次
- 开发者可以通过init方法的参数,获得代表当前filter配置信息的filterconfig对象,filter对象创建后会驻留在内存,当web应用移除或者服务器停止的时候才销毁
- 在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
- 当多个filter同时存在的时候就构成了
filter链
,此时会根据在web.xml中的注册顺序来决定先调用哪个filter。当第一个filter的doFilter方法被调用的时候,web服务器就会创建一个代表filter链的filterchain对象传递给该方法。通过判断filterchain中是否还有filter来决定后面是否继续调用filter
Listener
javaweb中的监听器,是application、session和request三大对象创建、销毁或者增删改时自动执行代码的功能组件
- ServletContextListener,顾名思义是对Servlet上下文的监听。对servlet上下文的创建和销毁进行监听
- ServletContextAttributeListener,监听servlet上下文属性的监听器(增加、删除、替换)
- HttpSessionListener,对session的创建和销毁进行监听。session的销毁又有两种情况:session超时、调用session对象的
invalidate()
方法使其失效 - HttpSessionAttributeListener,对session的属性的增加、删除、替换进行监听
- ServletRequestListener,对请求对象的初始化和销毁进行监听
Listener可以用于监听客户端的请求、操作等。通过listener可以触发一些动作,比如监听用户的在线数量、网站访问量等
Tomcat
汤姆猫(
tomcat作为web服务器实现了两个核心功能:
- HTTP服务器功能。进行socket通信(tcp),解析http报文
- Servlet容器。加载和管理Servlet,由Servlet具体负责处理Request请求
tomcat以上的两个功能对应着tomcat的两个核心组件:Connector和Container。Connector负责对外交流(http服务器),而Container负责内部(Servlet功能)
- Server:tomcat服务器
- Service:服务器内部的组件,一个Server可以拥有多个service,它能过将若干个connector组件绑定到一个container
- Connector:连接器,是service的核心组件之一。主要连接客户端请求,并且接收请求然后将其封装成Request对象和Response,交给Container进行处理,在Container处理完毕后交给Connector返回给客户端
- Container:容器,负责处理用户的Servlet请求
对于Connector,他需要完成三个功能
- Socket通信
- 封装请求变成Request对象
- Request转换成ServletRequest对象,将Response转成ServletResponse
所以Connector也有对应的三个组件分别负责上面的三个功能(反过来也是一样的,这里描述的是请求):
- EndPoint,负责TCP/IP通信,提供请求字节流给Processer
- Processer,提供Request对象给Adapter
- Adapter,提供标准的ServletRequest对象给Container
其中EndPoint和Processer的组合又叫ProtocolHandler
对于Container组件,它又叫Catalina
Container又有四种容器,分别叫
- Engine,是整个组件的Servlet引擎,用于管理多个虚拟站点,一个Service最多只有一个Engine,而一个Engine可以有多个host
- Host,一个站点/虚拟主机,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机地址下面可以包含多个Context
- Context,表示一个web应用程序,每一个Context都有唯一的路径,一个web应用有多个wrapper
- Wrapper,表示一个Servlet,负责管理整个Servlet的生命周期,包括装载、初始化、回收等
Tomcat的container又可以由下图概括: