天天看點

tomcat伺服器和session持久化1. tomcat是什麼?2. 目錄結構及作用3. session持久化示例

1. tomcat是什麼?

Tomcat是Apache 軟體基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發而成。

Tomcat 伺服器是一個免費的開放源代碼的Web 應用伺服器,屬于輕量級應用伺服器,在中小型系統和并發通路使用者不是很多的場合下被普遍使用,是開發和調試JSP 程式的首選。

Tomcat和IIS等Web伺服器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的預設模式。不過,Tomcat處理靜态HTML的能力不如Apache伺服器。

除tomcat外,web應用伺服器還有jetty,weblogic,websphere,undertow等。

注意:有時我們會将web叫做web伺服器,實際上tomcat更準确的叫法是應用伺服器。 web伺服器主要是指專門來處理html,css,圖檔等靜态資源的伺服器,必要apache伺服器。

2. 目錄結構及作用

tomcat目錄結構的截圖(tomcat8.5.42):
tomcat伺服器和session持久化1. tomcat是什麼?2. 目錄結構及作用3. session持久化示例
  • bin

    bin目錄主要要來存放tomcat指令的目錄,裡面主要有兩種類型的檔案,一種是以.bat為擴充名的檔案,一類是以.sh為擴充名的檔案。其中.bat的檔案是在windows平台的指令,.sh的檔案是在linux平台的檔案。

    該目錄中主要的檔案有一下幾個:

    1) setclasspath 用于設定Java環境變量,如JAVA_HOME,JRE_HOME等

    2) catalina 該檔案也是用來配置環境的,如CATALINA_HOME,及tomcat的安裝路徑,我們可以在此目錄設定Java的啟動參數,如最大最小堆空間大小:

    例如:

    JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx512m -Xmn128m -XX:PermSize=128m -XX:MaxPermSize=512m"

    3) startup 用來給啟動tomcat,當輕按兩下startup後,tomcat啟動,讀取catalina腳本配置啟動環境,catalina又會調用setclasspath腳本,用來設定jdk需要的環境變量,如果系統沒有定義JAVA_HOME環境變量,則在會報錯退出。

    4) shutdomn 用于停止tomcat服務

        5) startup.bat -security 安全啟動服務
  • conf

    該目錄主要用來存放tomcat的配置檔案, 重要的配置檔案如下:

    1)server.xml 用于配置端口号,虛拟主機,預設附加元件目,請求編碼等等,是tomcat中最常使用的配置檔案

    2)web.xml 為所有的部署在該tomcat下的web應用通用的配置,與每個web應用的web.xml配合使用。例如:

    DefaultServlet,就算系統中沒有配置任何的servlet,tomcat依然可以處理html,js,css等靜态資源的請求,就是這個servelt起的作用;

    JspServlet,當請求jsp頁面時,則會用到這個servlet。

    session過期時間配置session-timeout參數,也是在這個web.xml中配置的。

    3)catalina.policy 這個是tomcat安全相關的配置檔案,主要使用安全政策檔案可以在tomcat啟動是附上 -security

    4) catalina.properties 安全配置,類加載設定,不需掃描的類,字元緩存等配置

    5)context.xml 所有在tomcat中釋出的應用都會使用的公用配置,例如:釋出的web應用的描述檔案的位置及名稱,及session持久化配置等。session持久化示例請參考第三部分的示例

    6)tomcat-users.xml

    tomcat的角色(授權使用者)配置檔案,用于通路tomcat管理應用程式時的安全性設定,用server.xml中引用的預設的使用者資料庫域(UserDatabase Realm)使用它,所有的憑據都是預設被注釋的

    7)tomcat-users.xsd 定義了 tomcat-users.xml 所使用到的标簽,即tomcat-user.xml 的結構定義檔案

  • lib

    所有的部署在tomcat中的web應用公用的jar包

  • logs

    用于儲存tomcat運作時的日志資料,

    • catalina.{yyyy-MM-dd}.log tomcat自己的運作日志
    • localhost.{yyyy-MM-dd}.log 應用初始化日志,包含tomcat的啟動和暫停時的運作日志,沒有catalina.{yyyy-MM-dd}.log記錄的全,隻包含一部分
    • localhost_access_log.{yyyy-MM-dd}.txt tomcat通路日志,包括請求時間,資源,傳回的狀态碼
    • manager.{yyyy-MM-dd}.log 是tomcat管理控制台應用的專有日志
    • 在Linux系統中,tomcat将日志記入catalina.out檔案,可以使用 tail -f catalina.out 進行跟蹤。
  • temp

    存放tomcat在運作期間産生的臨時檔案,可以清空該目錄的檔案,但不能删除該目錄,可能會引發不可預知的錯誤。

  • webapps

    tomcat預設的項目部署目錄,在預設情況下,如果要釋出應用可以直接将應用的war包放入該目錄即可完成釋出,也可以直接釋出未壓縮的目錄,但要求該目錄需要符合web應用規範。

    • doc tomcat文檔
    • examples tomcat自帶的web應用示例
    • host-manager tomcat主機管理應用程式
    • manager tomcat的管理應用程式
    • ROOT 如果項目部署為ROOT,則在位址欄直接輸入:http://ip:port/ 就可以通路,即不用輸入應用名
  • work

    用來部署應用中由jsp檔案生成的java檔案和編譯之後的class檔案,可以删除,删除後可以迫使tomcat重新生成jsp對用的java和class檔案。

  • 其他檔案
    • LICENSE tomcat開源許可檔案
    • NOTICE tomcat說明檔案
    • RELEASE-NOTES 版本說明檔案
    • README.md 即 README.txt tomcat幫助檔案

3. session持久化示例

1)主要配置檔案

session持久化主要是在context.xml檔案中進行配置的,context.xml檔案可以出現在兩個位置上,其作用域不同,配置方式一緻:

  • tomcat安裝目錄\conf 目錄中的context.xml配置檔案,該檔案中的配置對部署在該tomcat中的所用應用都有效
  • 所開發的web應用的META-INFO目錄中,建立一個context.xml配置檔案,放在此處的配置,隻對所屬的web應用有效
  • 配置如下
  • <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    	<!-- 
    	maxIdleSwap:  自上次通路session以來,session資料應被儲存到stroe中的時間間隔,該值應該大于等于maxIdleBackup參數的值
    	maxIdleBackup: 自上次通路會話後,會話有資格保留到會話存儲區之前的時間間隔(秒),-1為預設值,表示禁用
    	saveOnRestart: 重新開機是是否持久化session
    	maxActiveSession:session總數大于該參數設定的值時,會将超出部分空閑的session換出
    	 -->
    	<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true" maxIdleBackup="1" maxIdleSwap="1">
            <Store className="org.apache.catalina.session.FileStore" directory="d:/aaa" />
        </Manager>
        
    </Context>
               
    2) 示例:
  • 建立web工程
  • 加入tomcat依賴
  • 具體代碼:

    Customer:

  • 建立一個Customer實體bean,之後會将該bean放入session,注意:因為session需要進行持久化,是以該bean需要實作兩個接口,分别為:HttpSessionActivationListener,Serializable
  • 建立一個servlet,在使用者通路該servlet時,将Customer存入session,已測試持久化
  • public class Customer implements HttpSessionActivationListener, Serializable {
    	
    	private String id;
    	private String name;
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	
    	@Override
    	public void sessionDidActivate(HttpSessionEvent event) {
    		String name = ((Customer)event.getSession().getAttribute("cust")).getName();
    		System.out.println("鈍化之後 = " + name);
    	}
    
    	@Override
    	public void sessionWillPassivate(HttpSessionEvent event) {
    		String name = ((Customer)event.getSession().getAttribute("cust")).getName();
    		System.out.println("鈍化之前 = " + name);
    	}
    
    	@Override
    	public String toString() {
    		return "Custom [hljs-string" style="color: #d69d85; line-height: 160%; box-sizing: content-box;">", name=" + name + "]";
    	}	
    }
               
    servlet:
  • @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
    	
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		doPost(req, resp);
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		
    		Object cust_obj = req.getSession().getAttribute("cust");		
    		if(Objects.isNull(cust_obj)) {
    			Customer cust = new Customer();
    			cust.setId("cust_001");
    			cust.setName("張三");
    			System.out.println("将客戶資訊放入session");
    			req.getSession().setAttribute("cust", cust);
    		} else {
    			System.out.println("客戶資訊已經放入session");
    			String name = ((Customer)req.getSession().getAttribute("cust")).getName();
    			System.out.println("從session擷取客戶資訊,name = " + name);
    		}
    		
    	}
    }
               
    将web應用部署,運作之後通路servlet,檢視指定的目錄中是否有session的持久化資料,重新啟動web,看session是否會從持久化資料中恢複。