java.io.NotSerializableException[轉]

 

在重啓Tomcat 5時發現報此錯誤.
查閱後發現tomcat 5以後重啓服務後tomcat會嘗試恢復session.
html


解決方法:java


方法一(經過配置,使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中指定上面的值. 這也全部的程序都使用這個設置了.
mysql


方法二:
既然報沒有序列化的錯誤,那咱們就把咱們的對象序列化了就是了,實現起來也很簡單,就是把要放入session的對象序列化便可
public class YourClassName implements java.io.Serializable{
}
其餘內容都徹底不須要變.
web

 

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

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服務器均可以訪問的到。
apache

server.XML文件解析 - 文件位置是<蔜ALINA_HOME%>/conf/server.xml瀏覽器

配置虛擬主機
Host元素表明虛擬主機,在同一個Engine元素下能夠配置多個虛擬主機。打開server.xml文件能夠發現Engine元素下已經有一個名爲localhost的Host元素了,能夠在它後面加入下列代碼:tomcat

<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文件。

相關文章
相關標籤/搜索