新聞資訊  快訊  焦點  財經  政策  社會
互 聯 網   電商  金融  數據  計算  技巧
生活百科  科技  職場  健康  法律  汽車
手機百科  知識  軟件  修理  測評  微信
軟件技術  應用  系統  圖像  視頻  經驗
硬件技術  知識  技術  測評  選購  維修
網絡技術  硬件  軟件  設置  安全  技術
程序開發  語言  移動  數據  開源  百科
安全防護  資訊  黑客  木馬  病毒  移動
站長技術  搜索  SEO  推廣  媒體  移動
財經百科  股票  知識  理財  財務  金融
教育考試  育兒  小學  高考  考研  留學
您當前的位置:首頁 > IT百科 > 站長技術 > 服務器

JAVA手寫tomcat,帶你了解tomcat的原理,附代碼

時間:2019-11-20 11:34:25  來源:  作者:

1 創建一個簡單的servlet

代碼示例:

package springmvc;

import JAVA.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.Httpservlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet{

/**

* 一個最簡單的servlet

*/

private static final long serialVersionUID = 7683475760018217521L;

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String data="這是我的第一個servlet!";

System.out.println(data);

}

}

web.xml中的標簽確定了servlet的訪問路徑

<!DOCTYPE web-App PUBLIC

"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

<display-name>Archetype Created Web Application</display-name>

<servlet>

<servlet-name>littleServlet</servlet-name>

<servlet-class>springmvc.MyServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>littleServlet</servlet-name>

<url-pattern>/servlet</url-pattern>

</servlet-mapping>

</web-app>

servlet完成之后需要需要將他打包成項目(war/jar),并解壓完成,形成完整的項目目錄,供后續自己寫的Tomcat使用。通常情況下,所有的項目都會放入tomcat的webapps目錄下。

開始手動編寫tomcat代碼

代碼示例

package springboot.tomcat;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;

import java.net.ServerSocket;

import java.net.Socket;

import java.security.Principal;

import java.util.Collection;

import java.util.Enumeration;

import java.util.Locale;

import java.util.Map;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import javax.servlet.AsyncContext;

import javax.servlet.DispatcherType;

import javax.servlet.RequestDispatcher;

import javax.servlet.Servlet;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.ServletInputStream;

import javax.servlet.ServletOutputStream;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpUpgradeHandler;

import javax.servlet.http.Part;

import springboot.util.ProjectUtil;

/**

* @author liuhongya328

*

*/

public class TomcatServer {

static int threads = 10;

private static ExecutorService pool = Executors.newCachedThreadPool();

/**

* @param args

*/

public static void main(String[] args) throws Exception{

//加載項目,獲取tomcat需要發布的所有項目及項目下的所有servlet信息

final Map<String, ProjectUtil.WebXml> projectIno = ProjectUtil.load();

ServerSocket serverSocket = new ServerSocket(8080);

System.out.println("Tomcat 啟動成功");

while(!serverSocket.isClosed()) {

//阻塞獲取新連接

Socket socket = serverSocket.accept();

pool.submit(()->{

//接收數據

InputStream inputStream = socket.getInputStream();;

//請求響應結果

OutputStream outputStream = socket.getOutputStream();

try {

System.out.println("收到請求:-------");

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));

String msg = null;

StringBuilder requestInfo = new StringBuilder();

while((msg = reader.readLine())!=null) {

if(msg.length()==0) {

break;

}

requestInfo.append(msg).append("rn");

}

System.out.println(requestInfo.toString()+"--------");

//請求需要訪問的servlet,這個servlet相當于業務代碼的controller,是需要放入tomcat中啟動的項目,用原生的servlet便于從底層代碼理解

//1.獲取請求方式 及請求路徑 GET /SpringMVC/servlet/littleServlet HTTP/1.1

String firstLine = requestInfo.toString().split("rn")[0];

String projectName = firstLine.split(" ")[1].split("/")[1];

String servletPath = firstLine.split(" ")[1].replace("/"+projectName, "");

//找到servlet對應的名稱--j2ee規范

String servletName = projectIno.get(projectName).servletMapping.get(servletPath).toString();

//找到servlet對應的實例

Servlet servlet = (Servlet) projectIno.get(projectName).servletInstances.get(servletName);

//將socket的inputsteam 轉成 request對象 ,如果想servlet接收和傳遞消息,需要實現自己的HttpServletRequest/HttpServletResponse即可。

//這里的創建僅作展示,實際沒有作用,并不會傳遞socket的信息。

HttpServletRequest servletReuqest = createRequest();

HttpServletResponse servletResponse = createResponse();

//servlet的生命周期

servlet.service(servletReuqest, servletResponse);

outputStream.write("HTTP/1.1 200 OKrn".getBytes());

outputStream.write("Content-Length: 12rnrn".getBytes());

outputStream.write("Hello World!".getBytes());

outputStream.flush();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

socket.close();

return null;

});

}

serverSocket.close();

}

private static HttpServletRequest createRequest() {

return new HttpServletRequest() {

@Override

public Object getAttribute(String name) {

// TODO Auto-generated method stub

return null;

}

@Override

public Enumeration<String> getAttributeNames() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getCharacterEncoding() {

// TODO Auto-generated method stub

return null;

}

@Override

public void setCharacterEncoding(String env) throws UnsupportedEncodingException {

// TODO Auto-generated method stub

}

@Override

public int getContentLength() {

// TODO Auto-generated method stub

return 0;

}

@Override

public long getContentLengthLong() {

// TODO Auto-generated method stub

return 0;

}

@Override

public String getContentType() {

// TODO Auto-generated method stub

return null;

}

@Override

public ServletInputStream getInputStream() throws IOException {

// TODO Auto-generated method stub

return null;

}

@Override

public String getParameter(String name) {

// TODO Auto-generated method stub

return null;

}

@Override

public Enumeration<String> getParameterNames() {

// TODO Auto-generated method stub

return null;

}

@Override

public String[] getParameterValues(String name) {

// TODO Auto-generated method stub

return null;

}

@Override

public Map<String, String[]> getParameterMap() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getProtocol() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getScheme() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getServerName() {

// TODO Auto-generated method stub

return null;

}

@Override

public int getServerPort() {

// TODO Auto-generated method stub

return 0;

}

@Override

public BufferedReader getReader() throws IOException {

// TODO Auto-generated method stub

return null;

}

@Override

public String getRemoteAddr() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getRemoteHost() {

// TODO Auto-generated method stub

return null;

}

@Override

public void setAttribute(String name, Object o) {

// TODO Auto-generated method stub

}

@Override

public void removeAttribute(String name) {

// TODO Auto-generated method stub

}

@Override

public Locale getLocale() {

// TODO Auto-generated method stub

return null;

}

@Override

public Enumeration<Locale> getLocales() {

// TODO Auto-generated method stub

return null;

}

@Override

public boolean isSecure() {

// TODO Auto-generated method stub

return false;

}

@Override

public RequestDispatcher getRequestDispatcher(String path) {

// TODO Auto-generated method stub

return null;

}

@Override

public String getRealPath(String path) {

// TODO Auto-generated method stub

return null;

}

@Override

public int getRemotePort() {

// TODO Auto-generated method stub

return 0;

}

@Override

public String getLocalName() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getLocalAddr() {

// TODO Auto-generated method stub

return null;

}

@Override

public int getLocalPort() {

// TODO Auto-generated method stub

return 0;

}

@Override

public ServletContext getServletContext() {

// TODO Auto-generated method stub

return null;

}

@Override

public AsyncContext startAsync() throws IllegalStateException {

// TODO Auto-generated method stub

return null;

}

@Override

public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse)

throws IllegalStateException {

// TODO Auto-generated method stub

return null;

}

@Override

public boolean isAsyncStarted() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isAsyncSupported() {

// TODO Auto-generated method stub

return false;

}

@Override

public AsyncContext getAsyncContext() {

// TODO Auto-generated method stub

return null;

}

@Override

public DispatcherType getDispatcherType() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getAuthType() {

// TODO Auto-generated method stub

return null;

}

@Override

public Cookie[] getCookies() {

// TODO Auto-generated method stub

return null;

}

@Override

public long getDateHeader(String name) {

// TODO Auto-generated method stub

return 0;

}

@Override

public String getHeader(String name) {

// TODO Auto-generated method stub

return null;

}

@Override

public Enumeration<String> getHeaders(String name) {

// TODO Auto-generated method stub

return null;

}

@Override

public Enumeration<String> getHeaderNames() {

// TODO Auto-generated method stub

return null;

}

@Override

public int getIntHeader(String name) {

// TODO Auto-generated method stub

return 0;

}

@Override

public String getMethod() {

//示例

return "GET";

}

@Override

public String getPathInfo() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getPathTranslated() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getContextPath() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getQueryString() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getRemoteUser() {

// TODO Auto-generated method stub

return null;

}

@Override

public boolean isUserInRole(String role) {

// TODO Auto-generated method stub

return false;

}

@Override

public Principal getUserPrincipal() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getRequestedSessionId() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getRequestURI() {

// TODO Auto-generated method stub

return null;

}

@Override

public StringBuffer getRequestURL() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getServletPath() {

// TODO Auto-generated method stub

return null;

}

@Override

public HttpSession getSession(boolean create) {

// TODO Auto-generated method stub

return null;

}

@Override

public HttpSession getSession() {

// TODO Auto-generated method stub

return null;

}

@Override

public String changeSessionId() {

// TODO Auto-generated method stub

return null;

}

@Override

public boolean isRequestedSessionIdValid() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isRequestedSessionIdFromCookie() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isRequestedSessionIdFromURL() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isRequestedSessionIdFromUrl() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean authenticate(HttpServletResponse response) throws IOException, ServletException {

// TODO Auto-generated method stub

return false;

}

@Override

public void login(String username, String password) throws ServletException {

// TODO Auto-generated method stub

}

@Override

public void logout() throws ServletException {

// TODO Auto-generated method stub

}

@Override

public Collection<Part> getParts() throws IOException, ServletException {

// TODO Auto-generated method stub

return null;

}

@Override

public Part getPart(String name) throws IOException, ServletException {

// TODO Auto-generated method stub

return null;

}

@Override

public <T extends HttpUpgradeHandler> T upgrade(Class<T> httpUpgradeHandlerClass)

throws IOException, ServletException {

// TODO Auto-generated method stub

return null;

}

};

}

private static HttpServletResponse createResponse() {

return new HttpServletResponse() {

@Override

public String getCharacterEncoding() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getContentType() {

// TODO Auto-generated method stub

return null;

}

@Override

public ServletOutputStream getOutputStream() throws IOException {

return null;

}

@Override

public PrintWriter getWriter() throws IOException {

// TODO Auto-generated method stub

return null;

}

@Override

public void setCharacterEncoding(String charset) {

// TODO Auto-generated method stub

}

@Override

public void setContentLength(int len) {

// TODO Auto-generated method stub

}

@Override

public void setContentLengthLong(long length) {

// TODO Auto-generated method stub

}

@Override

public void setContentType(String type) {

// TODO Auto-generated method stub

}

@Override

public void setBufferSize(int size) {

// TODO Auto-generated method stub

}

@Override

public int getBufferSize() {

// TODO Auto-generated method stub

return 0;

}

@Override

public void flushBuffer() throws IOException {

// TODO Auto-generated method stub

}

@Override

public void resetBuffer() {

// TODO Auto-generated method stub

}

@Override

public boolean isCommitted() {

// TODO Auto-generated method stub

return false;

}

@Override

public void reset() {

// TODO Auto-generated method stub

}

@Override

public void setLocale(Locale loc) {

// TODO Auto-generated method stub

}

@Override

public Locale getLocale() {

// TODO Auto-generated method stub

return null;

}

@Override

public void addCookie(Cookie cookie) {

// TODO Auto-generated method stub

}

@Override

public boolean containsHeader(String name) {

// TODO Auto-generated method stub

return false;

}

@Override

public String encodeURL(String url) {

// TODO Auto-generated method stub

return null;

}

@Override

public String encodeRedirectURL(String url) {

// TODO Auto-generated method stub

return null;

}

@Override

public String encodeUrl(String url) {

// TODO Auto-generated method stub

return null;

}

@Override

public String encodeRedirectUrl(String url) {

// TODO Auto-generated method stub

return null;

}

@Override

public void sendError(int sc, String msg) throws IOException {

// TODO Auto-generated method stub

}

@Override

public void sendError(int sc) throws IOException {

// TODO Auto-generated method stub

}

@Override

public void sendRedirect(String location) throws IOException {

// TODO Auto-generated method stub

}

@Override

public void setDateHeader(String name, long date) {

// TODO Auto-generated method stub

}

@Override

public void addDateHeader(String name, long date) {

// TODO Auto-generated method stub

}

@Override

public void setHeader(String name, String value) {

// TODO Auto-generated method stub

}

@Override

public void addHeader(String name, String value) {

// TODO Auto-generated method stub

}

@Override

public void setIntHeader(String name, int value) {

// TODO Auto-generated method stub

}

@Override

public void addIntHeader(String name, int value) {

// TODO Auto-generated method stub

}

@Override

public void setStatus(int sc) {

// TODO Auto-generated method stub

}

@Override

public void setStatus(int sc, String sm) {

// TODO Auto-generated method stub

}

@Override

public int getStatus() {

// TODO Auto-generated method stub

return 0;

}

@Override

public String getHeader(String name) {

// TODO Auto-generated method stub

return null;

}

@Override

public Collection<String> getHeaders(String name) {

// TODO Auto-generated method stub

return null;

}

@Override

public Collection<String> getHeaderNames() {

// TODO Auto-generated method stub

return null;

}

};

}

}

獲取項目信息的工具類

package springboot.util;

import java.io.File;

import java.net.URL;

import java.net.URLClassLoader;

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import javax.servlet.Servlet;

/**

*

* 加載項目信息

*

* */

public class ProjectUtil {

public static Map<String,WebXml> load() throws Exception{

final Map<String,WebXml> projetInfo = new HashMap<String,WebXml>();

//j2ee定義的是tomcat下的webapp目錄,本地我取自己打包的war包目錄

String webapps = "E:\learning\SpringMVC\SpringMVC\webapps";

//讀取tomcat發布的所有的項目

File[] projects = new File(webapps).listFiles(projectName -> projectName.isDirectory());

for(File project : projects) {

//根據每個項目的web.xml讀取servlet信息

WebXml webXml = new XMLConfigUtil().load(project.getPath()+"\WEB-INF\web.xml");

webXml.projectPath = project.getPath();

//類加載,加載class文件-----war包或者jar包中解壓的class文件

webXml.loadServlet();

projetInfo.put(project.getName(), webXml);

}

return projetInfo;

}

public class WebXml{

public String projectPath = null;

//查找項目中所有的servlet

public Map<String,Object> servlets = new HashMap<String,Object>();

public Map<String,Object> servletMapping = new HashMap<String,Object>();

//實例對象

public Map<String,Object> servletInstances = new HashMap<String,Object>();

public void loadServlet() throws Exception {

//jvm加載class文件

URL url = new URL("file:"+projectPath+"\WEB-INF\classes\");

URLClassLoader classLoader = new URLClassLoader(new URL[] {url});

//加載servlet,創建servlet對象

for(Entry<String,Object> entry : servlets.entrySet()) {

//servlet的名稱

String servletName = entry.getKey();

//servlet類的完整路徑

String servletClassName = entry.getValue().toString();

//加載

Class<?> clazz = classLoader.loadClass(servletClassName);

//反射創建對象,這就是為什么j2ee規范 servlet要繼承HttpServlet,

Servlet servlet = (Servlet) clazz.newInstance();

this.servletInstances.put(servletName, servlet);

}

}

}

}

解析web.xml的工具類

package springboot.util;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

import springboot.util.ProjectUtil.WebXml;

public class XMLConfigUtil extends DefaultHandler {

// 查找項目中所有的servlet

public Map<String, Object> servlets = new HashMap<String, Object>();

public Map<String, Object> servletMapping = new HashMap<String, Object>();

// 實例對象

public Map<String, Object> servletInstances = new HashMap<String, Object>();

private String tag;// 存儲操作的標簽

private boolean isMapping = false;

private String currentServlet;

private String currentServletMapping;

public WebXml load(String path) throws SAXException, IOException, ParserConfigurationException {

// SAX解析

// 1、獲取SAX解析工廠

SAXParserFactory factory = SAXParserFactory.newInstance();

// 2、從解析工廠中獲取解析器

SAXParser parse = factory.newSAXParser();

XMLConfigUtil handler = new XMLConfigUtil();

// 5、解析

parse.parse(path, this);

// 6、獲取數據

ProjectUtil.WebXml webXMl = new ProjectUtil().new WebXml();

webXMl.servlets = this.servlets;

webXMl.servletMapping = this.servletMapping;

return webXMl;

}

@Override

public void startDocument() throws SAXException {

}

@Override

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

if (null != qName) {

tag = qName;// 存儲標簽名

if (tag.equals("servlet")) {

isMapping = false;

} else if (tag.equals("servlet-mapping")) {

isMapping = true;

}

}

}

@Override

public void characters(char[] ch, int start, int length) throws SAXException {

String contents = new String(ch, start, length).trim();

if (null != contents) {// 處理空的問題

if (isMapping) {// 操作servlet-mapping

if (tag.equals("servlet-name")) {

currentServletMapping = contents;

} else if (tag.equals("url-pattern")) {

String urlPattern = contents;

servletMapping.put(urlPattern, currentServlet);

}

} else {// 操作servlet

if (tag.equals("servlet-name")) {

currentServlet = contents;

currentServletMapping = contents;

} else if (tag.equals("servlet-class")) {

String servletClass = contents;

servlets.put(currentServlet, servletClass);

}

}

}

}

}

說明

本次代碼沒有實現request和response是的交互,返回都是寫死的outputStream.write(“Hello World!”.getBytes())。

如果需要實現,需要寫自己的request和response。

JAVA手寫tomcat,帶你了解tomcat的原理,附代碼


Tags:tomcat   點擊:()  評論:()
聲明:本站部分內容來自互聯網,內容觀點僅代表作者本人,如有任何版權侵犯請與我們聯系,我們將立即刪除。
▌相關評論
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
▌相關推薦
雖然現在springboot微服務縱橫都是用的jar包,但是還有很多使用的tomcat。tomcat是servlet的容器,也是springboot默認集成的容器,有必要對他的網絡線程模型做一下了解。 (一) tomc...【詳細內容】
2019-11-27   tomcat  點擊:(0)  評論:(0)  加入收藏
第一步:創建腳本#!/bin/bash# func:自動監控tomcat腳本并且執行重啟操作# 獲取tomcat進程ID(其中[grep -w &#39;tomcat&#39;]代碼中的tomcat需要替換為你的tomcat文件夾名)Tomc...【詳細內容】
2019-11-27   tomcat  點擊:(0)  評論:(0)  加入收藏
本文記錄的是在CentOS 7下安裝與配置jdk-8u162的過程。一、下載jdk-8u162版本鏈接地址:官方地址二、上傳jdk到centos下三、檢查當前linux系統上是否有jdk,linux命令:rpm -qa |...【詳細內容】
2019-11-27   tomcat  點擊:(0)  評論:(0)  加入收藏
Tomcat9.0壓縮版本安裝教程1. 使用Tomcat前必須確保jdk 安裝成功;2. 需要配置環境變量命名JAVA_HOME如圖所示: 3. 把Tocmcat壓縮包解壓到你想要放的文件夾如圖所示: 4. 打開解...【詳細內容】
2019-11-27   tomcat  點擊:(0)  評論:(0)  加入收藏
基本環境準備jdk安裝配置。安裝目錄例如:/usr/java/jdk1.8.0_05tomcat下載放到約定目錄。例如:/usr/local/dmstomcat tomcat做成系統服務把tomcat做成系統服務,就可以使用servi...【詳細內容】
2019-11-20   tomcat  點擊:(6)  評論:(0)  加入收藏
1 創建一個簡單的servlet代碼示例:package springmvc;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import j...【詳細內容】
2019-11-20   tomcat  點擊:(5)  評論:(0)  加入收藏
首先,修改tomcat/conf/server.xml配置文件。<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="400" /> <Connector...【詳細內容】
2019-11-15   tomcat  點擊:(13)  評論:(0)  加入收藏
Tomcat 是我們最常用的服務器之一,合理的優化配置,往往有非常好的效果。配置的話主要分兩塊,一個 server.xml,還有一個就是 JVM 參數的配置。這里我們以8.5版本為例,主要看下 ser...【詳細內容】
2019-11-13   tomcat  點擊:(6)  評論:(0)  加入收藏
注:內容來源于我本人的微信公眾號:碼農歷險技有些spring boot項目平時的流量涌入比較大的,或者是當有活動的時候在活動那幾天涌入的流量也是很大的,這時候如果不對我們項目的線...【詳細內容】
2019-11-12   tomcat  點擊:(8)  評論:(0)  加入收藏
將皕杰報表demoserver中的演示項目report部署到tomcat8最新版本后,當訪問報表的URL中含有中文時,訪問報表報錯如下:十一月 11, 2019 2:38:58 下午 org.apache.coyote.http11.Ht...【詳細內容】
2019-11-12   tomcat  點擊:(11)  評論:(0)  加入收藏
本篇寫的是HTTPS在Tomcat中的配置方法;至于HTTPS安全認證的原理,大家可以上網查看去理解;學習建議:大家可以使用面向對象的方式去理解握手協議,單向認證與雙向認證的原理。(這篇本...【詳細內容】
2019-11-04   tomcat  點擊:(8)  評論:(0)  加入收藏
1、系統架構 2、服務器情況? 服務器 1:nginx(80)、redis(6379)? 服務器 2:tomcat1(8080)、tomcat2(8080)? 服務器 3:mysql(3306)3、Nginx 主要配置http { ...... upstream tomcat { ip_hash;...【詳細內容】
2019-10-30   tomcat  點擊:(14)  評論:(0)  加入收藏
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器。因為Tomcat 技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發商的...【詳細內容】
2019-10-30   tomcat  點擊:(45)  評論:(0)  加入收藏
前言Nginx+Tomcat對Session的管理一直有了解,但是一直沒有實際操作一遍,本文從最簡單的安裝啟動開始,通過實例的方式循序漸進的介紹了幾種管理session的方式。nginx安裝配置1....【詳細內容】
2019-10-30   tomcat  點擊:(10)  評論:(0)  加入收藏
問題描述tomcat日志中報too many open files導致程序無法讀取文件錯誤。報錯原因出現這句提示的原因是程序打開的文件/socket連接數量超過系統設定值。java.IOException:打...【詳細內容】
2019-10-28   tomcat  點擊:(17)  評論:(0)  加入收藏
Apache Tomcat默認安裝包含"/examples"目錄,該目錄包含許多示例servlet和JSP。其中一些示例存在安全風險,不應部署在生產服務器上。因為會話是全局的,所以這個示例會帶來很大的...【詳細內容】
2019-10-25   tomcat  點擊:(11)  評論:(0)  加入收藏
前言通過我之前的Tomcat系列文章,相信看我博客的同學對Tomcat應該有一個比較清晰的了解了,在前幾篇博客我們討論了Tomcat在SpringBoot框架中是如何啟動的,討論了Tomcat的內部組...【詳細內容】
2019-10-14   tomcat  點擊:(14)  評論:(0)  加入收藏
在JVM中并不是一次性把所有的文件都加載到,而是一步一步的,按照需要來加載。 比如JVM啟動時,會通過不同的類加載器加載不同的類。當用戶在自己的代碼中,需要某些額外的類時,再通過加載機制加載到JVM中,并且存放一段時間,便...【詳細內容】
2019-10-11   tomcat  點擊:(17)  評論:(0)  加入收藏
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。 1、選擇...【詳細內容】
2019-10-10   tomcat  點擊:(47)  評論:(0)  加入收藏
1 概述最近在部署項目,要求在Linux服務器上同時部署多個Tomcat,一個項目對應一個tomcat,由于以前沒有部署經驗,剛開始工作嗎,在部署的時候以為直接ootb就可以的,所有在部署的時候...【詳細內容】
2019-10-10   tomcat  點擊:(59)  評論:(0)  加入收藏
最新更新
欄目熱門
欄目頭條
31选7开奖11185