赞
踩
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
在运行Tomcat服务时,避免使用root用户运行,tomcat目录(catalina.home、 catalina.base目录)所有者应改为非root的运行用户
使用chown -R <Tomcat启动用户所属组>:<Tomcat启动用户> <Tomcat目录>修改tomcat目录文件所有者,如chown -R tomcat:tomcat /usr/local/tomcat
在运行Internet服务时,最好尽可能避免使用root用户运行,降低攻击者拿到服务器控制权限的机会。
创建低权限的账号运行Tomcat
当请求处理期间发生运行时错误时,ApacheTomcat将向请求者显示调试信息。建议不要向请求者提供此类调试信息
在Tomcat根目录下的conf/web.xml文件里面的web-app添加子节点:<error-page><exception-type>java.lang.Throwable</exception-type><location>/error.jsp</location></error-page>,在webapps目录下创建error.jsp,定义自定义错误信息
Tomcat需要保存输出日志,以便于排除错误和发生安全事件时,进行分析和定位
1、修改Tomcat根目录下的conf/server.xml文件。
2、取消Host节点下Valve节点的注释(如没有则添加)。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost\_access\_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
3、重新启动Tomcat
Tomcat允许显示目录文件列表会引发目录遍历漏洞
修改Tomcat 跟目录下的配置文件conf/web.xml,将listings的值设置为false。 <param-name>listings</param-name> <param-value>false</param-value>
Tomcat安装提供了示例应用程序、文档和其他可能不用于生产程序及目录,存在极大安全风险,建议移除
请删除Tomcat示例程序和目录、管理控制台等,即从Tomcat根目录的webapps目录,移出或删除docs、examples、host-manager、manager目录。
tomcat-manger是Tomcat提供的web应用热部署功能,该功能具有较高权限,会直接控制Tomcat应用,应尽量避免使用此功能。如有特殊需求,请务必确保为该功能配置了强口令
编辑Tomcat根目录下的配置文件conf/tomcat-user.xml,修改user节点的password属性值为复杂密码, 密码应符合复杂性要求:
1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱密码,如:abcd.1234 、admin@123等
限制服务器平台信息泄漏会使攻击者更难确定哪些漏洞会影响服务器平台。
1、进入Tomcat安装主目录的lib目录下,比如 cd /usr/local/tomcat7/lib
2、执行:jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties,修改文件ServerInfo.properties中的server.info和server.number的值,如分别改为:Apache/11.0.92、11.0.92.0
3、执行:jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
4、重启Tomcat服务
屏蔽版本
关闭shutdown
端口
禁用管理界面
自定义错误页面
AJP协议
修改Cookies安全性
Tomcat安全规范
Tomcat性能优化
Linux 修改catalina.sh 文件
windows修改cataliba.bat
文件
其它内容
tomcat项目的部署方式
第一种:项目直接放入 webapps 目录中
第二种:修改 conf/server.xml 文件
第三种 在conf\Catalina\localhost
下新增wwwroot.xml
相同IP不同端口部署
在tomcat的安装目录下的lib目录中找到catalina.jar文件,通过压缩软件打开,找到catalina.jar\org\apache\catalina\util\ServerInfo.properties文件修改里面的内容
server.info=Apache Tomcat/8.5.38
server.number=8.5.38.0
server.built=Feb 5 2019 11:42:42 UTC
server.info=Apache Tomcat
server.number=0.0.0.0
server.built=Feb 5 2009 11:42:42 UTC
shutdown
端口Tomcat的配置文件server.xml中有这么一行:
通过telnet连接到8005端口发送SHUTDOWN指令关闭tomcat服务器。
我们可以修改指令,将SHUTDOWN换成一个不容易猜测到的字符串,或者把port的值直接改成-1
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
生成环境下修改webapps目录下的ROOT文件夹,将它重命名或者制空
修改在conf目录下面的web.xml的文件,在文件内追加:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
定义:WEB服务器通过TCP连接和SERVLET容器连接。为了减少进程生成socket的花费,WEB服务器和SERVLET容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会在分配。换句话说,在连接上,请求不是多元的。这个是连接两端的编码变得容易,虽然这导致在一时刻会有很多连接。
作用:通过AJP协议来通过Apache进行访问的代理。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
所以当我们不需要用Apache做访问代理的话,最好在server.xml文件中将上面那句话给注释掉(减少性能开销)。
如果不想注释掉也至少改成下面这个样子:
<Connector port="8009" protocol="AJP/1.3" address="127.0.0.1" redirectPort="8443" />
禁止将8009端口暴露在外面,造成安全隐患。
设置成httpOnly=true,修改默认cookie名称
修改conf目录下的context.xml文件
<Context useHttpOnly="true" sessionCookieName="yoursessionname">
升级到最新稳定版,出于稳定性考虑,不建议进行跨版本升级。
不使用root用户启动tomcat,使用普通用户启动
针对该信息的显示是由一个jar包控制的,
该jar包存放在$CATALINA_HOME/lib目录下,名称为 catalina.jar,
通过 jar xf 命令解压这个 jar 包会得到两个目录 META-INF 和 org ,
修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo
字段来实现来更改我们tomcat的版本信息
默认Tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
编辑conf/web.xml文件
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value> //这里false为不列出,true为充许列出
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
强烈建议不要使用 Tomcat 的虚拟主机,推荐每个站点使用一个实例。即,可以启动多个 Tomcat,而不是启动一个 Tomcat
里面包含多个虚拟主机。 因为
Tomcat是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到所有应用程序。虽然采用多实例的方式会产生过多的开销,但至少保障了应用程序的隔离和安全
控制CATALINAHOME/bin目录下的start.sh、catalina.sh、shutdown.sh的可执行权限
chmod −R 744 CATALINA_HOME/bin/\*
为了防止 Tomcat 被植入 web shell 程序后,可以修改项目文件。因此我们要将 Tomcat
和项目的属主做分离,这样子,即便被搞,他也无法创建和编辑项目文件。
server=“Microsoft-IIS/6.5”
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
server="Microsoft-IIS/6.5" />
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.10,192.168.1.30,192.168.2.\*" deny=""/>
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="www.test.com,\*.test.com" deny=""/>
</Host>
开启tomcat默认访问日志中Referer和User-Agent记录
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost\_access\_log"
suffix=".txt" pattern="%h %l %u %t "%r" %s %b %{Referer}i %{User-Agent}i %D"
resolveHosts="false" />
<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>
禁用AJP协议
将BIO通讯模式修改为NIO通讯模式
<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>
其它配置项:
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
enableLookups="false"
maxPostSize="10485760"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
acceptCount="100"
acceptorThreadCount="2"
disableUploadTimeout="true"
maxConnections="10000"
SSLEnabled="false"
/>
修改bin/catalina.bat文件设置参数(注释后第一行),增加
set JAVA_OPTS=-Dfile.encoding=UTF-8
-server
-Xms1024m
-Xmx2048m
-XX:NewSize=512m
-XX:MaxNewSize=1024m
-XX:PermSize=256m
-XX:MaxPerPermSize=356m
-XX:NewRatio=2
-XX:MaxTenuringThreshold=50
-XX:+DisableExplicitGC
修改 /usr/program/tomcat7/bin/catalina.sh 文件,把下面信息添加到文件第一行。
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms2048m -Xmx2048m -Xmn1024m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
机子内存如果是 8G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms4096m -Xmx4096m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
CATALINA_OPTS=“-Dfile.encoding=UTF-8 -server -Xms8192m -Xmx8192m -Xmn4096m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC”
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms16384m -Xmx16384m -Xmn8192m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
-Xms2048m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=512m
如果是 16G 开发机
-Xms4096m -Xmx4096m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:PermSize=256m -XX:MaxPermSize=512m
-Dfile.encoding:默认文件编码
-server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的
-Xmx1024m:设置JVM最大可用内存为1024MB
-Xms1024m:设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn1024m:设置JVM新生代大小(JDK1.4之后版本)。一般-Xmn的大小是-Xms的1/2左右,不要设置的过大或过小,过大导致老年代变小,频繁Full GC,过小导致minor GC频繁。如果不设置-Xmn,可以采用-XX:NewRatio=2来设置,也是一样的效果
-XX:NewSize:设置新生代大小
-XX:MaxNewSize:设置最大的新生代大小
-XX:PermSize:设置永久代大小
-XX:MaxPermSize:设置最大永久代大小
-XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代)。设置为 4,则年轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5
-XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。需要注意的是,设置了 -XX:MaxTenuringThreshold,并不代表着,对象一定在年轻代存活15次才被晋升进入老年代,它只是一个最大值,事实上,存在一个动态计算机制,计算每次晋入老年代的阈值,取阈值和MaxTenuringThreshold中较小的一个为准。
-XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC
第一种:项目直接放入 webapps 目录中
第二种:修改 conf/server.xml 文件
打开tomcat下conf/server.xml,在标签之间输入项目配置信息
<?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" URIEncoding="UTF-8" useBodyEncodingForURI="true" server="Microsoft-IIS/6.5" /> <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"> <Context path="/wwwroot" docBase="F:/wwwroot" reloadable="true" /> <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>
第三种 在conf\Catalina\localhost
下新增wwwroot.xml
里面的内容就一句话:
<Context docBase="F:/wwwroot" reloadable="true" />
在server.xml中多追加一个service
<Service name="web">
<Connector port="8088" protocol="HTTP/1.1" maxThreads="700" acceptCount="100" connectionTimeout="2000" redirectPort="8445" URIEncoding="UTF-8"/>
<Engine name="web" defaultHost="localhost">
<Host name="localhost" appBase="webapp1">
<Context docBase="F:/wwwroot" path="" reloadable="true" />
</Host>
</Engine>
</Service>
漏洞修复方案
**1.版本升级,**截至2020-2-24,官方公布的已修复该漏洞版本包括:
Apache Tomcat 7.0.100
Apache Tomcat 8.5.51
Apache Tomcat 9.0.31
2.关闭AJPConnector:
修改conf/server.xml配置文件的,删除或注释掉这一行,修改后重启tomcat。
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
3.配置AJP协议的secret(此方法只能减少漏洞被利用的可行性,可以配合版本升级使用):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" address="YOUR_ADDRESS" secret="YOUR_SECRET"/>
建议将 Tomcat 立即升级到 9.0.31、8.5.51 或 7.0.100 版本进行修复,同时为 AJP Connector 配置 secret 来设置 AJP 协议的认证凭证。例如(注意必须将 YOUR_TOMCAT_AJP_SECRET 更改为一个安全性高、无法被轻易猜解的值)
https://www.jianshu.com/p/8bd6419caa1e
https://www.jianshu.com/p/f4c0c0476dae
一、配置
Tomcat/conf/server.xml修改配置
<connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
redirectPort="8443"
URIEncoding="UTF-8"
minSpareThreads="25"
maxSpareThreads="300"
maxThreads="500"
acceptCount="500"
connectionTimeout="30000"
enableLookups="false"/>
二、参数说明
maxIdleTime:最大空闲时间,超过这个空闲时间,且线程数大于minSpareThreads的,都会被回收,默认值1分钟(60000ms);
minSpareThreads:最小空闲线程数,任何情况都会存活的线程数,即便超过了最大空闲时间,也不会被回收,默认值4;
maxSpareThreads:最大空闲线程数,在最大空闲时间(maxIdleTime)内活跃过,此时空闲,当空闲时间大于maxIdleTime则被回收,小则继续存活,等待被调度,默认值50;
maxThreads:最大线程数,大并发请求时,tomcat能创建来处理请求的最大线程数,超过则放入请求队列中进行排队,默认值为200;
acceptCount:当最大线程数(maxThreads)被使用完时,可以放入请求队列排队个数,超过这个数返回connection refused(请求被拒绝),一般设置和max
Threads一样,不过这个具体需要根据自己的应用实际访问峰值和平均值来权衡,默认值为100;
connectionTimeout:网络连接超时,假设设置为0表示永不超时,这样设置隐患巨大,通常可设置为30000ms,默认60000ms。
Windows Tomcat允许每个进程maxThreads(最大线程数)2000
Linux Tomcat允许每个进程maxThreads(最大线程数)1000
https://www.jianshu.com/p/6dd2ab2f376b
1,针对logging.properties。
修改conf/logging.properties日志配置文件可以屏蔽掉部分的日志信息。
将level级别设置成WARNING就可以大量减少日志的输出,当然也可以设置成OFF,直接禁用掉。
可以直接用下边的内容替换掉原来的文件。如果也是tomcat8的话。
$cat conf/logging.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ############################################################ # Handler specific properties. # Describes specific configuration info for Handlers. ############################################################ 1catalina.org.apache.juli.AsyncFileHandler.level = OFF 1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. java.util.logging.ConsoleHandler.level = OFF java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter ############################################################ # Facility specific properties. # Provides extra control for each logger. ############################################################ org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = OFF org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = OFF org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = OFF org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler # For example, set the org.apache.catalina.util.LifecycleBase logger to log # each component that extends LifecycleBase changing state: #org.apache.catalina.util.LifecycleBase.level = FINE # To see debug messages in TldLocationsCache, uncomment the following line: #org.apache.jasper.compiler.TldLocationsCache.level = FINE
2,关闭localhost_access_log日志。
修改在tomcat的安装目录conf文件夹下server.xml里配置,将AccessLogValve注释掉。
<!-- Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" / -->
一般这段代码的位置就在配置的底部,注释掉。
3,管理catalina.out。
这个文件是tomcat的启动日志,很多时候可以帮助我们运维,可以留下来。
如果需要关闭,则可以设置bin/catalina.sh文件:
搜索:
if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi
可以更改后边的输出路径为/dev/null,让启动日志从此无影无踪。
但是一般不建议关闭这条日志输出,而时间长了之后,这个文件又会非常大,可以通过定时任务的策略进行定期清空处理:
crontab -e
#clean the log
0 */4 * * * echo a > /usr/local/tomcat/logs/catalina.out
![img](https://img-blog.csdnimg.cn/img_convert/36a4ba97b20d77e17e2c171589d6a854.png)
![img](https://img-blog.csdnimg.cn/img_convert/759a5ea18eb2fb014c904f66acd716cd.png)
![img](https://img-blog.csdnimg.cn/img_convert/f1c2183424910b32d3193037390b620b.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**
pattern="%h %l %u %t "%r" %s %b" / -->
一般这段代码的位置就在配置的底部,注释掉。
3,管理catalina.out。
这个文件是tomcat的启动日志,很多时候可以帮助我们运维,可以留下来。
如果需要关闭,则可以设置bin/catalina.sh文件:
搜索:
if [ -z "$CATALINA_OUT" ] ; then
CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi
可以更改后边的输出路径为/dev/null,让启动日志从此无影无踪。
但是一般不建议关闭这条日志输出,而时间长了之后,这个文件又会非常大,可以通过定时任务的策略进行定期清空处理:
crontab -e
#clean the log
0 */4 * * * echo a > /usr/local/tomcat/logs/catalina.out
[外链图片转存中...(img-ODTbVbC3-1715880603605)]
[外链图片转存中...(img-Be0XekoF-1715880603606)]
[外链图片转存中...(img-KoWdnfBT-1715880603606)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。