0
点赞
收藏
分享

微信扫一扫

获取cookie的方式

悬灸人雪洋 04-12 23:00 阅读 2
tomcatxml

tomcat基本流程

  1. tomcat在启动时将webapps下的每个项目中的web.xml读取,获取相关信息。tomcat只关心Servlet 程序、Filter 过滤器、Listener 监听器,不关心其他类。

  2. tomcat接收到请求后会将请求报文转换成一个httpServletRequest对象,包含请求所有信息

  3. tomcat同时创建了一个httpServletResponse对象,用于承装要响应给客户端的信息,后面该对象会被转换成响应报文

  4. tomcat根据请求资源路径找到对应的servlet,将servlet实例化,调用service方法,同时将HttpServletRequest和HttpServletResponse对象传入

手写tomcat大致步骤:

  • 建立一个接收TCP请求的服务端ServerSocket。

    • 如何处理连接?处理阻塞?

      • processSocket

    • 如何处理多个请求?while()

    • 如何处理串行问题? 线程池

      • ExecutorService

  • 如何处理连接

    • 通过具体的连接socket对象获取数据 socket.getInputStream()

      • 输出成字节可以看到获取的字节

    • 解析字节流,

      • 了解HTTP协议的格式

      • 按照格式去解析http协议、请求行、头、体

    • 根据解析的内容,构造得到request对象

      • request属性:method构造方法、url、protocal协议版本

    • 按servlet规范实现request和response

      • 实现HttpServletRequest、HttpServletReponse接口

    • 新建Servlet类,继承HttpServlet

    • socket.getOutputStream().write()

tomcat结构和配置

  • 结构图,

  • 配置文件解析:

    • Server:顶层元素,是整个配置文件的根元素,即服务器,每个 tomcat 程序启动后,就是一个 server。

      • className: 使用的 java 类名

      • address:服务器等待接收 shutdown 命令的地址,默认 localhost

      • port: 接收 shutdown 命令的端口,设置为 - 1 为禁用关闭端口,也就是你不能通过这种方式来关闭了,这样就会影响你使用脚本 (catalina.sh 或者是 shutdown.sh) 来 stop 了,默认绑定 8005 端口

      • shutdown: 指定 shutdown 命令的别名,默认值 SHUTDOWN

    • Listener: 监听器,不允许内嵌其他组件;listener中定义的组件可以在某事件发生时执行相应的操作;监听器可以在Server、Engine、Host或Context中,如下代码定义的5个监听器都是在Server中。

      • VersionLoggerListener:当Tomcat启动时,该监听器记录Tomcat、Java和操作系统的信息。该监听器必须是配置的第一个监听器。

      • AprLifecycleListener:Tomcat启动时,检查APR库,如果存在则加载。APR,即Apache Portable Runtime,是Apache可移植运行库,可以实现高可扩展性、高性能,以及与本地服务器技术更好的集成。

      • JreMemoryLeakPreventionListener:与类加载器导致的内存泄露有关。

      • GlobalResourcesLifecycleListener:通过该监听器,初始化< GlobalNamingResources>标签中定义的全局JNDI资源;如果没有该监听器,任何全局资源都不能使用。

      • ThreadLocalLeakPreventionListener:当Web应用因thread-local导致的内存泄露而要停止时,该监听器会触发线程池中线程的更新。当线程执行完任务被收回线程池时,活跃线程会一个一个的更新。只有当Web应用(即Context元素)的renewThreadsWhenStoppingContext属性设置为true时,该监听器才有效。

    • GlobalNamingResources: 元素定义了全局资源,如下配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。

    • Service:Tomcat服务器提供的服务,通常包含一个或多个Connector(连接器),但只能有一个引擎engine。默认是

      • className: 要使用的 java 类名,未指定的话就使用标准的实现

      • name: 显示的名称

      • tomcat默认的一个服务是Catalina

    • Connector:是Tomcat服务器与外部应用程序或客户端之间的连接,常见的Connector类型包括HTTP、HTTPS、AJP等。

      • port:指定Connector监听的端口号,用于监听来自客户端的请求。

      • protocol:连接器使用的协议,指定Connector要使用的协议类型,常见的有HTTP/1.1、HTTP/2、AJP/1.3等。

      • connectionTimeout:指定超时的时间数(以毫秒为单位),即在指定时间内未收到客户端请求,则连接被关闭。

      • redirectPort:指定重定向端口,即在使用HTTPS时,自动将HTTP请求重定向到HTTPS。

      • maxParameterCount:最大可以创建的处理请求的线程数。

    • Engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。

      • defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值一样。

    • host:在Tomcat中,一个物理服务器可以部署多个虚拟主机,每个虚拟主机拥有自己的域名和独立的配置,这些虚拟主机通过Host元素来实现。

      • name:虚拟主机的名称,可以是域名和ip

      • appBase:指定该虚拟主机的Web应用程序的基础目录,Web应用程序在该目录下部署。

      • unpackWARs:是否在部署Web应用程序时解压WAR文件,可以提高Web应用程序的访问速度。

      • autoDeploy:是否自动部署新的Web应用程序,如果设置为true,则Tomcat会自动检测appBase目录下的新的Web应用程序,并进行自动部署。

    • Context:一个Context就是一个应用。

      • Context:表示一个web应用程序,通过为war文件。

      • docBase:表示Web应用程序的根目录,即Web应用程序的发布目录。应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。

      • path:表示Web应用程序的上下文路径,即访问该Web应用程序的URL路径。

      • reloadable:这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序。

      • crossContext:用于指定不同的Web应用程序之间是否可以共享ServletContext对象。如果crossContext被设置为true,则表示允许跨上下文共享ServletContext对象,否则不允许。

    • Valve:通过提供不同类型的阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve),实现对Tomcat服务器的访问控制、流量控制、日志记录等功能。

      <?xml version="1.0" encoding="UTF-8"?>
      <Server port="8005" shutdown="SHUTDOWN">
        <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
        <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
        <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
        <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
        <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
        <GlobalNamingResources>
          <Resource name="UserDatabase" auth="Container" 
                    type="org.apache.catalina.UserDatabase"
                    description="User database that can be updated and saved"
                    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                    pathname="conf/tomcat-users.xml" />
        </GlobalNamingResources>
        <Service name="Catalina">
          <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
                     redirectPort="8443" maxParameterCount="1000" />
          <Engine name="Catalina" defaultHost="localhost">
            <Realm className="org.apache.catalina.realm.LockOutRealm">
              <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                     resourceName="UserDatabase"/>
            </Realm>
            <Host name="localhost"  appBase="webapps"
                  unpackWARs="true" autoDeploy="true">
              <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                     prefix="localhost_access_log" suffix=".txt"
                     pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Host>
          </Engine>
        </Service>
      </Server>
举报

相关推荐

0 条评论