天天看點

java.io.NotSerializableException錯誤解決方法

在重新開機Tomcat 5時發現報此錯誤.

查閱後發現tomcat 5之後重新開機服務後tomcat會嘗試恢複session.

解決方法:

方法一(通過配置,使tomcat重新開機後不重新恢複session):

在關閉和重新開機Tomcat 5時, tomcat 會試圖 serialize存在的session資源. 如果 sessions中相關的對象沒有實作 serializable 接口, 就會出現Cannot serialize session attribute XXX for 異常

java.io.NotSerializableException: ...........

如果你不想看到該異常, 也不想儲存session. 那麼你可以在項目部署描述檔案中(如. test.xml,)(instead of just exploding the war) 的    <Context> tags中間 加上 :

<Manager className="org.apache.catalina.session.PersistentManager"

saveOnRestart="false">

       <Store className="org.apache.catalina.session.FileStore"/>

</Manager>

Manager元素可以嵌套在Context元件中。如果不包含它,會自動建立一個預設的Manager配置,這對大多數需求都是足夠的。

詳見Tomcat伺服器配置參考http://www.cnjsp.org/document/user/tuman/manager.html

這樣 tomcat 在關閉的時候就不會儲存session資源了.

你也可以在server.xml中指定上面的值. 這也所有的程式都使用這個設定了.

方法二:

既然報沒有序列化的錯誤,那我們就把我們的對象序列化了就是了,實作起來也很簡單,就是把要放入session的對象序列化即可

public class YourClassName implements java.io.Serializable{

}

其他内容都完全不需要變.

下面貼點Tom小貓的相關資料:

Jakarta Tomcat伺服器是一種Servlet/JSP容器,經曆了3.x到4.0.x到4.1.x的變遷,現在最新的版本為5.0.x,支援Servlet2.4和JSP2.0規範,從apache網站上下載下傳Tomcat 5,在環境變量中配置一下Java_HOME,小貓就能生靈活現的跑起來了。若小貓啟動失敗,DOS視窗會自動關閉,若運作catalina run指令DOS視窗是不會自動關閉的。

tomcat中有三個放置java庫的地方,分别是/server/lib、/shared/lib和/common/lib。

差別:/server/lib - 其中的jar檔案隻能被tomcat伺服器通路。

/shared/lib - 其中的jar檔案可以被所有的Web應用通路,但不能被tomcat伺服器通路到。

/common/lib - Web服務和tomcat伺服器都可以通路的到。

server.XML檔案解析 - 檔案位置是<蔜ALINA_HOME%>/conf/server.xml

配置虛拟主機

Host元素代表虛拟主機,在同一個Engine元素下可以配置多個虛拟主機。打開server.xml檔案可以發現Engine元素下已經有一個名為localhost的Host元素了,可以在它後面加入下列代碼:

<Host name="www.myname.com" debug="0" apPBase="c:\myname" unpackWar="true" autoDeploy="true">

<alias>www.myname1.com</alias>

<alias>www.myname2.com</alias>

<Context pathh="/helloapp" docBase="helloapp" debug="0" reloadable="true"/>

</Host>

Session的使用

Session是一種用來跟蹤使用者狀态的機制,那它是怎麼實作的呢?Servlet容器通過在用戶端浏覽器中儲存一個Session ID來跟蹤Session,調用session.getID()可以看到你的Session ID是多少。如果用戶端支援Cookie,就把Session ID作為Cookie保持在浏覽器中,現在絕大多數浏覽器都會把Cookie功能打開,但如果使用者禁止了Cookie呢?Java Servlet API中提出了另外一種機制,Servlet容器可以重寫客戶requst的URL,把Session ID添加到URL資訊中,HttpServletResponse接口提供了這樣的方法:public String encodeURL(String url)-先判斷如果沒有啟用Session,例如jsp中<%@ page session="false"%>或執行了session.invalideate(),那麼直接傳回url,在判斷用戶端師父支援Cookie,如果不支援,就在url中加入Session ID的資訊,然後傳回修改後的url。

Session的管理

當一個sesson開始時,Servlet容器會建立一個HttpSession對象,在某些情況下把這些Httpsession對象從記憶體中轉移到檔案系統中或資料庫中,需要通路的時候在把它們載入到記憶體中來。這樣做的好處有兩點:節約了記憶體的消耗,當web伺服器産生故障時,還可以從檔案系統或資料庫中恢複Session的資料。

對于Session的管理,小貓提供了兩個實作類:org.apache.catalina.session.StandardManager和org.apache.catalina.session.PersistentManager。

StandardManager -是預設的方法,當Tomcat伺服器重新開機或重載的時候,會把Session對象儲存到

<蔜ALINA_HOME%>/work/Catalina/honstname/applicatonname/SESSIONS.ser(預設值)檔案中,每個對象對應一個檔案,以Session ID為檔案名,例如:

<Context path="/helloapp" docBase="helloapp" debug="0" reloadable="true">

<Manager className="org.apache.catalina.session.StandardManager" debug="0"

maxActiveSessions="-1" checkInterval="60" />

</Context>

參數說明:checkInterval-檢查session是否過期的時間間隔,以秒為機關,預設值是60秒;

maxActiveSessions-可處于活動狀态的session數。

PersistentManager -提供了更加靈活的管理方式,具有容錯能力,可以及時把Session備份到Session Store中,可以控制記憶體中Session的數量。

小貓還提供了實作持久化Session Store的接口,org.apache.catalina.Store,目前提供了兩個具體實作類:org.apache.catalina.FileStore和org.apache.catalina.JDBCStore。

server.xml中的配置File Store -

<Context path="/helloapp" docBase="helloapp" debug="0" reloadable="true">

<Manager className="org.apache.catalina.session.PersistentManager" debug="0" saveOnRestart="true"

maxActiveSessions="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" >

<Store className="org.apache.catalina.session.FileStore" directory="mydir"/>

</Manager>

</Context>

參數說明:saveOnRestart-伺服器關閉時,是否将所有的session儲存到檔案中;

maxActiveSessions-可處于活動狀态的session數;

minIdleSwap/maxIdleSwap-session處于不活動狀态最短/長時間(s),sesson對象轉移到File Store中;

maxIdleBackup-超過這一時間,将session備份。(-1表示沒有限制)

JDBCStore配置的差別:

<Store calssName="org.apache.catalina.JDBCStore" driverName="com.MySQL.jdbc.Driver"

connectionURL="jdbc:mysql://localhost/tomsessionDB?user=root&password="

sessionTable="tomcat_session" sessionIdCol="session_id" sessionDataCol="session_data"

sessionValidCol="session_valid" sessionMaxInactiveCol="max_inactive"

sessionLastAccessedCol="last_access" sessionAppCol="app_name" checkInterval="60" debug="99" />

Session失效時間的設定

在web.xml檔案中,位于<servlet-mapping>和<welcome-file-list>元素之間加入如下代碼,機關為分鐘:

<session-config>

<session-timeout>60</session-timeout>

</session-config>

Tomcat的admin平台和manager平台

這是Tomcat中自帶的兩個Web應用,位于<蔜ALINA_HOME%>/server/webapps/admin(manager),通路位址是http://localhsot:8080/admin(manager)。要通路這兩個Web應用,需要在

<蔜ALINA_HOME%>/conf/tomcat-users.xml中添加如下内容:

<user username="admin" password="1234" role="admin"/> //對應admin Web應用

<user username="manager" password="1234" role="manager"/> //對應manager Web應用

admin平台把所有可配置的資訊分為三類:Tomcat Server、Resources、User Definition。

Tomcat Server-相當于server.xml中的<Server>元素及其子元素,<Service>、<Host>、<Context>、<Resources>、<Date Source>。

Resources-相當于server.xml中的<GlobalNamingResources>,共有四種資源:Date Source(JNDI資料源)、Mail Sessioin(JNDI Mail Session資源)、Environment Entry(環境變量)、User Database(安全域中的使用者資料庫)。

User Definition-與tomcat-users.xml相對應。

manager平台-列出來所有Web應用和狀态,并提供了Start、Stop、Reload、 Undeploy指令,還可以釋出

<蔜ALINA_HOME%>/webapps目錄下的Web應用或系統檔案任意位置的WAR檔案。