热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

ApacheTomcat负载平衡设置方法具体解析

每个Tomcatworker是一个服务于webserver、等候履行servlet的Tomcat实例。例如我们经常应用像Apache之类的webserver转发sevlet恳求给位于其后面的一个Tomcat过程(也就是前面所说的worker)。本文具体先容了如何配置各种类型worker和loadbalance,并

一、简介:

每个Tomcat worker是一个服务于web server、等候履行servlet的Tomcat实例。例如我们经常应用像Apache之类的web server转发sevlet恳求给位于其后面的一个Tomcat过程(也就是前面所说的worker)。本文具体先容了如何配置各种类型worker和loadbalance,并阐明了各种类型worker的特征和loadbalance配置的原理。

二、为什么应用Tomcat workers:

上文描写了一个非常简略的结构,事实上能够配置多个Tomcat workers来处理web server转发的servlet恳求。而这样配置的理由不过乎以下几种假想环境:

* 我们在开发环境中宣布不同的Tomcat workers为各自不同的利用服务。当然在开发环境中的开发者共享同一个web server,但是每个Tomcat worke服务于拥有它的开发者。

* 我们在不同的Tomcat过程上定义各自的虚拟主机,这样不同的公司可以应用各自的web site,从而使他们的web site得到了公平的分割。

* 我们供给负载平衡的web site,也就意味着同时应用多个Tomcat workers,而每个Tomcat worker具有独立的主机并且在workers之间要分配通过web server转发来的恳求。

当然,这些假想情况也许并不能涵盖应用多个workers的所有状态。

三、workers.properties配置阐明:

定义Tomcat workers的方法是在apache的conf目录下编写一个名为“workers.properties”的属性文件。本文将具体说明如何进行配置的:

1.定义Workers列表:

定义workers的方法就是在apache的conf目录下编写一个workers.properties文件,使其作为apache的插件来施展作用。

定义workers列表的格局:

worker.list =<应用“,”分割的worker 名字列表>

例如:

worker.list= worker1, worker2

当apache启动时,workers.properties作为插件将初始化呈现在worker.list列表中的workers。

2.定义Workers的类型:

每个被命名的worker都应有一些关于其自身的附加信息。这些信息包含了worker的类型和其它相干信息。这里讨论的是JK1.2.5中定义的workers类型。

定义worker类型的格局:

worker . worker名字. type =

worker名字的命名最好遵守java的命名规范。

worker类型取值于下面的表格:

定义一个名为“local”的worker,其应用ajpv12协议与Tomcat 过程通信:

worker.local.type=ajp12

定义一个名为“remote”的worker,其应用ajpv13协议与Tomcat 过程通信:

worker.remote.type=ajp13

定义一个名为“fast”的worker,其应用JNI的方法与Tomcat 过程通信:

worker.fast.type=jni

定义一个名为“loadbalancer”的worker,其作为对多个Tomcat 过程的负载平衡应用:

worker.loadbalancer.type=lb

各个类型具有不同的行动,我们在下文中会具体说明。

3.设置Worker属性:

 

在定义worker之后,还需要供给各个worker的属性,这些属性的定义应用下面的方法:

worker..<属性>=<属性值>

3-1 ajp12类型的Worker属性:.

ajp12类型的worker工作时应用基于TCP/IP socket的ajpv12协议转发恳求给“过程外”Tomcat worker。

ajp12 worker属性如下:

host:

侦听ajp12恳求的Tomcat worker主机。

port:

Tomcat worker主机的侦听端口。

lbfactor:

当此Tomcat worker被用于一个负载平衡worker应用时,此属性将被应用。它定义了此worker的负载平衡权值。

例如:下面的“worker1”定义了一个位于www.x.com主机上的Tomcat,它应用8007端口侦听apache发来的恳求,并具有2.5的负载权值

worker.worker1.host=www.x.comworker.worker1.port=8007worker.worker1.lbfactor=2.5

留心:在ajpv12协议中,针对每个恳求都要一个连接建立、应用、封闭。其默认侦听端口为8007。

3-2 ajp13类型的Worker属性:

ajp13类型的worker工作时应用基于TCP/IP socket的ajpv13协议转发恳求给“过程外”Tomcat worker。

ajpv13协议与ajpv12协议的重要不同:

* ajpv13具有更丰富的二进制协议,它应用将频繁应用的字符串编码为小整数的方法对恳求数据进行压缩。

* ajpv13重用打开的socket并保留这些打开的socket以处理将来的恳求。这在apache与Tomcat之间具有防火墙的网络环境下是必要的。

* ajpv13具有对SSL信息的处理才能,以致容器能够实现SSL的相干方法(如isSecure())。

留心:ajp13当前只能用于支撑“过程外”协议的Tomcat 4.0.x, 4.1.x and 5。

下表描写了ajp13worker接收的属性:

host:

侦听ajp13恳求的Tomcat worker主机。

port:

Tomcat worker主机的侦听端口。

lbfactor:

当此Tomcat worker被用于一个负载平衡worker应用时,此属性将被应用。它定义了此worker的负载平衡权值。

cachesize:

当在多线程的web server(例如apache2.0、IIS 、Netscape)中应用JK时,此属性是有效的。假如将cachesize的值设置为较高的值,这些支撑多线程的web server将获得很好的处理才能。假如此属性不被设置,则连接cache特征将失效。

cache_timeout:

本属性用于声明JK在cache中保留一个打开的socket的时间,它对减少web serer的线程数有所帮助。

应用cache_timeout的原因:

周所周知,一个身背重负的web server(例如apache)建立childs/threads来处理负载,而当负载减少时它将烧毁无用的childs/threads。每个child在转发恳求给Tomcat时要打开一个ajp13连接,而在Tomcat那一端也将建立一个ajp13线程与之通信。但是标题呈现在一个ajp13连接建立完成后,child没有及时的开释那个ajp13连接,由于web server1将保持它的childs/threads运行已处理高负载,即使childs/threads处理快速的静态内容,在Tomcat端也将积累很多的无用ajp13线程。

socket_keepalive:

当防火墙位于web server与Tomcat之间时,防火墙将尝试断开未激活的网络连接。此属性将告诉把持系统在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依附于把持系统的设置,一般为120秒),这样将防止防火墙切断未激活的网络连接。

但此设置并不是万能钥匙,它对于某些防火墙也无能为力。

socket_timeout:

此属性阐明连接在未激活的状态下持续多久,web server将主动切断之。这是一个使Tomcat真个陈腐线程不致过多的好方法,但是也带来了在下一次恳求到来时需要重新打开socket的开销。此属性与cache_timeout有类似的功效,但是它工作在non-cache模式。

connect_timeout:

web server在连接建立后将一个PING恳求发送到ajp13协议的连接上。 此属性阐明了web server等候PONG回应的时间(以ms为单位)。此属性在jk 1.2.6版本被增加进来,以求避免Tomcat的逝世机,Tomcat 3.3.2 , 4.1.28  and 5.0.13 实现了对应用ajp13的 ping/pong的支撑。此属性默认为失效的。

prepost_timeout:

web server在转发一个恳求后将一个PING恳求发送到ajp13协议的连接上。此属性阐明了web server等候PONG回应的时间(以ms为单位)。此属性在jk 1.2.6版本被增加进来,以求避免Tomcat的逝世机,Tomcat 3.3.2 , 4.1.28  and 5.0.13 实现了对应用ajp13的 ping/pong的支撑。此属性默认为失效的。

reply_timeout:

此属性告诉web server在接到远真个Tomcat已逝世并实时的切换到集群中的另外一个Tomcat的回应之前等候一段时间。默认情况下web server将永远等候。属性值为web server要等候回应的时间(以ms为单位),所以假如具有运行时间较长的servlet时设置其值要警惕。此属性在jk 1.2.6版本被增加进来,以求避免Tomcat的逝世机和在支撑ajp13的servlet引擎上产生的标题。此属性默认为失效的。

recovery_options:

此属性阐明了web server在检测到Tomcat失败后如何进行恢复工作。默认情况下,web server将转发恳求给处于负载平衡模式中的另一个Tomcat。属性值为0,阐明全部恢复;属性值为1,阐明假如在Tomcat接到恳求后呈现失败状态,则不进行恢复;属性值为2,阐明假如在Tomcat发送http头给客户端后呈现失败状态,则不进行恢复;属性值为3,阐明假如在Tomcat接到恳求后呈现失败状态或者在Tomcat发送http头给客户端后呈现失败状态,则不进行恢复。此属性在jk 1.2.6版本被增加进来,以求避免Tomcat的逝世机和在支撑ajp13的servlet引擎上产生的标题。此属性默认为全部恢复。

例如:一个名为“worker2”的worker的配置:

worker.worker2.host
=www2.x.comworker.worker2.port=
8009worker.worker2.lbfactor
=3.5worker.worker2.cachesize
=10worker.worker2.cache_timeout

=600worker.worker2.socket_keepalive
=1worker 'worker2' want ajp13 connection to be dropped after
5mn (timeout)worker.worker2.socket_timeout=300


阐明:上例中的worker请求把持系统在连接上发送KEEP-ALIVE信号。

留心:在ajpv13协议中默认端口为8009。

4.设置lb Worker属性:

负载平衡类型的worker并不与Tomcat worker通信,它负责治理这些Tomcat worker。


其治理范畴如下:

* 初始化在web server的worker列表中定义的worker。

* 应用worker的负载平衡权值,履行基于权值的负载平衡,将数目多的恳求发送到负载平衡权值高(在web server看来就是更加硬朗的)的worker。

* 保护在同一个Tomcat worker上的同一个session的恳求,使其发送到同一个Tomcat worker上。以达到Tomcat worker上的session一致性、持续性。

* 标识已经失败的Tomcat workers,悬空发向它们的恳求,在被lb worker治理的其它workers上寻找可以失败恢复的worker。

被同一个lb worker治理多个worker之间的负载平衡的(基于它们的lbfactor和当前用户session),也可以尽量避免由于单一的Tomcat过程逝世掉而造成这个网站被“杀”的不良反应。

下表阐明了lb worker接收的属性:

* balanced_workers:一个由“,”分割的worker列表,用来声明lb worker需要被治理的workers。这些workers不应呈现在worker.list属性中。

* sticky_session:表述是否将对SESSION ID的恳求路由回到雷同的Tomcat worker。假如属性值不为0,它将被设置为JK_TRUE,session将是粘性的,即SESSION ID的恳求路由回到雷同的Tomcat worker;当Tomcat正应用能够跨越多个Tomcat实例持久化session数据的Session Manager时,它将被设置为JK_FALSE。属性默认值为JK_TRUE。

例如:worker balance1治理着两个workers:worker1、worker2:

worker.balance1.balanced_workers=worker1, worker2

5.高级lb Worker属性:


JK 1.2.x版本通过增加两个新的属性:local_worker_only 和 local_worker 为lb worker增加了新的负载平衡和容错支撑。

下面让我们举一个实际的环境作为example:

一个集群具有两个节点(worker1 worker2),一个web server与tomcat workers一前一后,一个负载平衡器(lb Worker)位于节点的前面、web server的后面。

配置如下:

worker.list=router# Define a 'local_worker'
worker using ajp13worker.worker1.port=8009worker.worker1.host
=node1.domain.orgworker.worker1.type=ajp13worker.worker1.lbfactor
=1worker.worker1.local_worker=1# Define another 'local_worker'
worker using ajp13worker.worker2.port=8009worker.worker2.host
=node2.domain.orgworker.worker2.type=ajp13worker.worker2.lbfactor
=1worker.worker2.local_worker=0# Define the LB
workerworker.router.type=lbworker.router.balanced_workers
=worker1,worker2worker.router.local_worker_Only=1

在worker1和worker2上的local_worker标记告诉lb_worker哪个连接属于本地worker。

假如local_worker值为非0,则它将被设置为JK_TRUE,用来标记“local worker”,而JK_FALSE的情况则相反。假如至少一个worker被标记为local worker,则lb_worker将工作于local worker模式。这种模式下,所有的local workers将被移到在lb_worker中的内部worker列表的头部。

这意味着一个带有session id的恳求达到lb_worker时,相应的worker(根据权值排序,权值最大的那个worker)将被断定作为此恳求的接收/处理者。假如这个worker逝世掉/当机,恳求将被发送到处于非错误状态的第一个local worker;假如一个没有session id的恳求达到lb_worker时,此恳求将被路由到第一个local worker。假如所有的local worker均处于错误状态,则这时“local_worker_only”标记显得尤其重要。假如local_worker_only的属性值为非0,则它被设置为 JK_TRUE,否则被设置为 JK_FALSE。当它被设置为 JK_TRUE时,这个没有session id的恳求将得到一个错误作为回应,否则lb_worker将尝试将恳求路由到其它的被治理的worker上。假如其中的一个worker处于错误状态,并且恢复会话的工作并没有任何转变,local worker将查找这个没有session id的恳求(由于在local worker中保留有这个恳求的session),而其它的worker只能查找带有session id的恳求。

留心:local_worker默认值是0,local_worker_only默认值也是0。

6.为什么需要这么复杂的过程吗?

由于我们对于一个封闭的节点需要一个具有灵性的保护。

在节点前面的平衡器周期性的对每个节点的特定端口进行查询。假如我们从集群中移走一个节点,我们就会隐性的封闭掉这个特定的端口。由于负载平衡器不能连接它,这个节点将被标记为down。但是我们没有移动在那个封闭的节点上的session到其它的节点上。在这个环境下,假如平衡器发送一个没有session id的恳求到一个端口被关掉的节点,那么一个错误将产生。假如平衡器测试到一个节点被标记为down的状态,而没有其它的节点答应发送没有session id的恳求。这样这些陈腐的session恳求就只有路由到那个被封闭的节点才干被接收。在一段时间后,这些陈腐的session将超时。由于所有的陈腐的session过期,那个不可达(被封闭)的节点将失往这个恳求。同时也会导致我们的servlet系统发送一个没有session id的重定向回应给浏览器。

但是可能被封闭的节点将会up,重新参加到集群中来,在它上面仍将保留着陈腐的session。所以在最后一个session超时后,更新节点能够为陈腐的session的恢复带来盼看,而不是杀掉sessions或者把它们移到其它节点上。而且有时假如那些陈腐的session中有很多big的对象,那么移动它们也将花费很多时间。

7.jni类型的Worker属性:

jni worker会在web server过程中打开一个JVM,并在其中履行Tomcat,这叫做“过程内”worker。来往于JVM的消息将通过调用JNI方法被传递,这使jni worker比那些需要应用ajp消息通信的“过程外”worker履行的更快。

留心:由于JVM是多线程的,jni worker应当只被用于在支撑对线程的web server(AOLServer, IIS, Netscape and Apache 2.0)上。同时还应当确认在web server上应用的线程计划是否与被应用的JK web server插件相匹配。

由于jni worker 打开了一个JVM,它将接收一些属性(例如classpath等)并将其传递给JVM:

worker.worker名.class_path:“过程内”的JVM要应用的classpath。它将包含所有的Tomcat的jar文件和class、配置文件等。

为了获得JSP编译器的支撑,我们需要将Javac添加到classpath中。当然对于Java2需要添加tools.jar到classpath,而对于JDK1.xx则要添加classes.zip到classpath。

worker.worker名.class_path:用于以多行的情势声明多个classpath。JK环境将用“:”或者“;”把这些classpath;连接起来。

例如:给名为“wrkjni”的worker设置classpath。

worker.wrkjni.class_path=/var/tomcat3/lib/tomcat.jarworker.wrkjni.class_path=/opt/IBMJava2-131/lib/tools.jar

worker.worker名.bridge:用于标识将通过JNI方法被应用的Tomcat的类型。此属性目前有两个属性值:tomcat32 or tomcat33。Tomcat 3.2.x固然已经过期,但是被供给用于宣布在一些类似iSeries系统上。此属性的默认值为tomcat33。

例如:给“wrkjni”设置bridge类型为tomcat3.3。

worker.wrkjni.bridge=tomcat33

worker.worker名.cmd_line: 此属性供给了在Tomcat启动代码履行的命令行。应用时将命令行的命令、参数分解为多个cmd_line属性。JK环境通过在各个cmd_line属性值之间添加空格将这些cmd_line连接在一起。

例如:设置“wrkjni”的cmd_line属性。

worker.wrkjni.cmd_line=-configworker.wrkjni.cmd_line=/etc/tomcat3/conf/alt-server.xmlworker.wrkjni.cmd_line=-homeworker.wrkjni.cmd_line=/var/tomcat3

上面例子中的第一行声明了-config参数名,而第二行声明了与之对应的参数值。第三行与第四行同理。

worker.worker名.jvm_lib:用于声明JVM的实现库的完整路径。Jni worker应用这个路径动态装载JVM。

例如:设置“wrkjni”的JVM shared lib (IBM SDK on Linux)。

worker.wrkjni.jvm_lib=/opt/IBMJava2-131/jre/bin/classic/libjvm.so

例如:设置“wrkjni”的JVM shared lib (Sun SDK on Windows)。

worker.wrkjni.jvm_lib=c:\JDK\1.3.1\jre\bin\classic

worker.worker名.stdout:设置JVM写它的System.out的完整路径地位。

例如:将“wrkjni”的JVM系统输前途径设置为/var/log/http/jk-jvm-out.log。

worker.wrkjni.stdout=/var/log/http/jk-jvm-out.log

worker.worker名.stderr:设置JVM写它的System.err的完整路径地位。

例如:将“wrkjni”的JVM系统错误输前途径设置为/var/log/http/jk-jvm-err.log

worker.wrkjni.stderr=/var/log/http/jk-jvm-out.log

worker.worker名.ms:设置JVM的初始堆大小。

例如:设置“wrkjni”的JVM的初始堆为64M。

worker.wrkjni.ms=64

worker.worker名.mx:设置JVM的最大的堆大小。

例如:设置“wrkjni”的JVM堆最大为128M

worker.wrkjni.mx=128

worker.worker名.sysprops:设置JVM的系统属性。

例如:设置“wrkjni”的JVM应用法语。

worker.wrkjni.sysprops=-Duser.region=FR

worker.worker名.ld_path:设置附加的动态链接库路径(类似于LD_LIBRARY_PATH)

例如:添加一些动态链接库路径到“wrkjni”的java环境中。

worker.wrkjni.ld_path=/opt/IBMJava2-131/jre/bin/worker.wrkjni.ld_path
=/opt/IBMJava2-131/jre/bin/classic

留心:在Linux下,上面的ld_path并不能更新LD_LIBRARY_PATH,所以需要在履行web server之前手动更新LD_LIBRARY_PATH,。

8.属性文件宏:

我们可以在属性文件中定义“宏”。这些宏让我们定义属性,并在以后应用它们来构建其它的属性文件。当我们修正Java Home、Tomcat Home、系统路径分隔符时这是很有用的。

例如:定义了属性workers.tomcat_home、workers.java_home。

workers.tomcat_home=d:\tomcatworkers.java_home=d:\sdk\jdk1.2.2

在定义worker.inprocess.class_path时就可以应用前面定义的workers.tomcat_home。

worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes

9.一个简略而完整的worker.properties:


文件中定义了比拟完整的结构,可以做为参考模版:

* 一个位于localhost的应用8007端口的ajp12 worker;

* 一个位于localhost的应用8008端口的ajp13 worker;

* 一个jni worker;

* 一个lb worker:负责ajp12 worker、ajp13 workers的负载平衡。

文件内容如下:

# Define some propertiesworkers.apache_log=/var/log/httpd/workers.tomcat_home
=/var/tomcat3workers.java_home=/opt/IBMJava2-131/ps
=/# Define 4 workers, 3 real workers using ajp12, ajp13, jni,
the last one being a loadbalancing workerworker.list
=worker1, worker2, worker3, worker4# Set properties for worker1 (ajp12)
worker.worker1.type=ajp12worker.worker1.host
=locahostworker.worker1.port=8007worker.worker1.lbfactor
=5# Set properties for worker2 (ajp13)worker.worker2.type
=ajp13worker.worker2.host
=locahostworker.worker2.port=8009worker.worker2.lbfactor
=50worker.worker2.cachesize=10worker.worker2.cache_timeout
=600worker.worker2.socket_keepalive=1worker.worker2.socket_timeout
=300# Set properties for worker3 (jni)worker.worker3.type
=jni# Set worker3 bridge type, here Tomcat 3.3worker.worker3.bridge
=tomcat33# Set worker3 classpathworker.worker3.class_path
=$(workers.tomcat_home)$(ps)classesworker.worker3.class_path

=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar#
Set worker3 tomcat command lineworker.worker3.cmd_line
=-homeworker.worker3.cmd_line
=$(workers.tomcat_home)# Set worker3 Tomcat/JVM
settingsworker.worker3.jvm_lib=$(workers.java_home)$(ps)
jre$(ps)bin$(ps)classic$(ps)libjvm.soworker.worker3.stdout
=$(workers.apache_log)$(ps)inprocess.stdoutworker.worker3.stderr
=$(workers.apache_log)$(ps)inprocess.stderrworker.worker3.sysprops
=tomcat.home=$(workers.tomcat_home)# Set properties for worker4 (lb)
which use worker1 and worker2worker.worker4.balanced_workers=worker1,worker2

 

 

 

 

 

 

 


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 标题: ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
author-avatar
ccmm6688
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有