时间:2023-06-30 16:33:01 | 来源:网站运营
时间:2023-06-30 16:33:01 来源:网站运营
7.Tomcat之参数配置:<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> name注:线程池名称,用于 Connector中指定。namePrefix注:所创建的每个线程的名称前缀,一个单独的线程名称为 namePrefix+threadNumber。maxThreads注:池中最大线程数。默认值200minSpareThreads注:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。默认值10maxIdleTime注:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。当核心线程数满了之后,新来的任务会添加到阻塞队列,当队列满了之后才会创建非核心线程,因为上述用的阻塞队列是无界队列,所以不会创建非核心线程, 即该时间也没用。maxQueueSize注:linkedQueue在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。默认:Integer.MAX_VALUEprestartminSpareThreads注:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。threadPriority注:线程池中线程优先级,默认值为5,值从1到10。className注:线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口。 ...线程池的设置要考虑任务类型IO型还是计算密集型,还要兼顾机器的性能。
连接器参数博客<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="10000" redirectPort="8443" maxConnections="2" maxThreads="2" acceptCount="2"/>port:端口protocol:协议connectionTimeout:是建立TCP连接后,等待第一次客户端发送请求的超时时间,如果超过则会断开连接。默认值是60000mskeepAlivedTime:是客户端发送完第一次请求后,到第二次的间隔超时时间时间。
重要参数<?xml version="1.0" encoding="UTF-8"?><!--关闭服务器的端口--><Server port="8005" shutdown="SHUTDOWN"> <!--日志形式输出服务器,操作系统,JVM的版本信息--> <Listener className="org.apache.catalina.startup.VersionLoggerListener"/> <!--用于加载(服务器启动)和销毁(服务器停止)APR,如果找不到APR库,则会输出日志不影响tomcat的启动--> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/> <!--用于避免JRE内存泄露--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <!-- 全局命名服务--> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <!-- 用于Context停止时重建Executor中的线程,避免ThreadLocal相关的内存泄露 --> <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共享线程池, <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="200" minSpareThreads="100" maxIdleTime="60000" 时间是毫秒,1分钟 maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> 如果没有配置则各个connector用自己的线程池 --> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool"/> <!--executor指定共享线程池的名字 --> <!-- AJP协议监听端口 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> <!-- 默认使用的虚拟主机名称, 当客户端请求指向的主机无效时, 将交由默认的虚拟主机处理, 默认主机名为localhost --> <Engine name="Catalina" defaultHost="localhost"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- Host 元素用于配置一个虚拟主机, 它支持以下嵌入元素:Alias、Cluster、Listener、Valve、Realm、Context。 如果在Engine下配置Realm, 那么此配置将在当前Engine下的所有Host中共享。 同样,如果在Host中配置Realm , 则在当前Host下的所有Context中共享。 Context中的Realm优先级 > Host 的Realm优先级 > Engine中的Realm优先级。 --> <!-- 1) name: 当前Host通用的网络名称, 必须与DNS服务器上的注册信息一致。 Engine中包含的Host必须存在一个名称与Engine的defaultHost设置一致。 2) appBase: 当前Host的应用基础目录, 当前Host上部署的Web应用均在该目录下(可以是绝对目录,相对路径)。默认为webapps。 3) unpackWARs: 设置为true, Host在启动时会将appBase目录下war包解压为目录。设置为false, Host将直接从war文件启动 4) autoDeploy: 控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用。(将改完的包放到tomcat里,不用重新启动,tomcat会自动重新部署) --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 1) docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于 Host appBase的相对路径。 2) path:Web应用的Context 路径。如果我们Host名为localhost, 则该web应用访问的根路径为: http://localhost:8080/myApp。 --> <Context docBase="demon" path="/demon"> </Context> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> </Host> </Engine> </Service></Server>
一个完整的Connector配置<Connector port="8080" protocol="HTTP/1.1" executor="tomcatThreadPool" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="20000" connectionTimeout="20000" compression="on" compressionMinSize="2048" disableUploadTimeout="true" redirectPort="8443" URIEncoding="UTF-8" />
<Host name="flank1" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> </Host> <Host name="flank2" appBase="webapps2" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> </Host>
<context-param> <param-name>database</param-name> <param-value>mysql</param-value> </context-param>public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("doGet....."); //获取context-param参数 String database = request.getServletContext().getInitParameter("database"); response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("<h1>" + database + "</h1>"); out.println("</body></html>"); }
这些配置也可以在代码里面写。<!-- 配置Session--> <session-config> <!--session的失效时间默认30分钟--> <session-timeout>30</session-timeout> <cookie-config> <!--默认的名字是JESSIONID也可以修改--> <name>JESSIONID-flank</name> <!--域名--> <domain>localhost</domain> <path>/</path> <!--注释信息--> <comment>Session Cookie</comment> <!--表示这个Cookie只能通过浏览器发送http请求携带过来,不能通过JS发送--> <http-only>true</http-only> <!--如果为true则只有https的请求,才能携带session信息--> <secure>false</secure> <!--Cookie的有效时间,一个小时--> <max-age>3600</max-age> </cookie-config> <!--跟踪模式,使用COOKIE进行会话跟踪,还有就是使用URL进行跟踪,就是将SESSION在URL上进行赋值--> <tracking-mode>COOKIE</tracking-mode> </session-config>
验证 服务器端通过代码public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("doGet....."); //获取context-param参数 String database = request.getServletContext().getInitParameter("database"); //获取sessionID String id = request.getSession().getId(); System.out.println("id = " + id); response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("<h1>" + database + "</h1>"); out.println("<h1>" + id + "</h1>"); out.println("</body></html>"); }
浏览器端 <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>com.example.demo.HelloServlet</servlet-class> <!--设置servlet的初始化参数,只对当前servlet有效,区别context-param--> <init-param> <!--可以用HttpServlet的getInitParameter方法来获取值--> <param-name>name</param-name> <param-value>tom</param-value> </init-param> <!-- 应用程序启动的时候加载该Servlet,如果值<0则是当第一次访问时加载, 可以用servlet的init方法什么时候调用来体现. --> <load-on-startup>1</load-on-startup> <!--true:表示当前servlet可用可以接收请求--> <enabled>true</enabled> </servlet> <!--请求路径和servlet的映射--> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <!-- 配置应用的参数--> <context-param> <param-name>database</param-name> <param-value>mysql8.2</param-value> </context-param>
<filter> <filter-name>myFilter</filter-name> <filter-class>com.example.demo.LanguageFilter</filter-class> <init-param> <param-name>language</param-name> <param-value>CN</param-value> </init-param> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>public class LanguageFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //获取filter的配置参数 String language = filterConfig.getInitParameter("language"); System.out.println("filter-init: " + language); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("doFilter"); chain.doFilter(request, response); } @Override public void destroy() { System.out.println("destroy"); }}
如果是springboot项目就不用配置方式了,使用注册MyFilterBean的方式来创建filter.和Intercepter的区别<!--欢迎页面--> <welcome-file-list> <!--尝试请求的顺序,从上到下--> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 当出现了异常时可以避免用户看到. 用来配置访问异常时定向到的页面,支持HTTP响应码和异常类两种形式--> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/505.html</location> <!--在servlet中使用i/0来造异常--> </error-page>
<!--添加一个连接器用来监听8443端口--><Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" schema="https" secure="true" SSLEnabled="true"> <SSLHostConfig certificateVerification="false"> <Certificate certificateKeystoreFile="tomcatkey.keystore" certificateKeystorePassword="tomcat" type="RSA" /> </SSLHostConfig> </Connector>
4.重启tomcat测试 关键词:配置,参数