1 cookie相關:
java中的cookie類:javax.servlet.http.Cookie類。
新建Cookie:Cookie cookie = new Cookie(“name”,”value”)
設置:
cookie.setName(“newname”);
cookie.setValue(“newvalue”);
cookie.setMaxAge(int second):這裏塗過second設置爲負值或者不設置setMaxAge方法,代表瀏覽器關閉就刪除這個Cookie,如果設置爲0,表示通知瀏覽器立刻刪除這個Cookie。
cookie.setPath(String path):設置當前cookie的有效路徑,即在哪個路徑範圍內有效。如果要設置爲當前應用有效,則path爲”/”。
request.getCookies()獲取一個客戶端的Cookie[]數組。
response.addCookie(Cookie cookie)向客戶端添加一個Cookie。
2 由於創建HttpSession對象會佔用內存,所以Web服務器一般不會在客戶端第一次打開頁面是創建session,而是在用戶第一次使用到session時創建。例如:
2.1 HttpServletRequest.getSession()方法獲取session的時候,如果session還沒有創建,就創建session後返回這個session。
2.2 HttpServletRequest.getSession(boolean flag),true代表不存在時創建session,false代表不創建,返回null。
3. 錯誤說法:session的生命週期從創建到關閉瀏覽器。
http協議不能識別到客戶端瀏覽器的關閉,也不會在協議中存儲關閉瀏覽器的狀態。
即使瀏覽器已經關閉,只要session的期限還沒有到,服務器端就還是存在這個session的。同樣,即使瀏覽器還沒有關閉,但是上次session對象(不是session中存儲的值)訪問後,到現在的時間間隔已經超過了session的設置期限的話,服務器端也會刪除這個session。
在tomcat中設置session的有效時間期限:
在conf下的web.xml中:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
時間單位是分鐘。
在代碼中設置:
HttpSession.setMaxInactiveInterval(int second)
這裏的單位是秒鐘。
獲取session上次被訪問的時間:
HttpSession.getLastAccessedTime()返回一個long值,代表1970年至今的時間。
4. session持久化管理。
持久化的對象必須實現了Serializable接口。
tomcat中的session持久化。
如果沒有配置持久化,tomcat也會默認使用簡單的session持久化類org.apache.catalina.session.StandardManager來對實現了Serializable接口的session中存儲的對象進行持久化,這種簡單的持久化是把這些對象持久化到本地文件,存儲路徑默認爲:Catalina/honstname/applicatonname/SESSIONS.ser(默認值)文件中。也可以通過配置自定義這種持久化的參數,例如:
<Context path="/testcontext" docBase="/context">
<Manager className="org.apache.catalina.session.StandardManager" debug="0" maxActiveSessions="-1" checkInterval="60" />
</Context>
這裏的一個Manager元素就代表一個session持久化配置。checkInterval-檢查session是否過期的時間間隔,以秒爲單位,缺省值是60秒; maxActiveSessions-可處於活動狀態的session數。-1代表無限制。
如果不想使用默認的持久化類,可以使用tomcat提供的更加靈活的持久化類。配置如下:
<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表示沒有限制)
tomcat還提供了實現持久化Session Store的接口,org.apache.catalina.Store,目前提供了兩個具體實現類:org.apache.catalina.FileStore和org.apache.catalina.JDBCStore。分別表示將session持久化到本地文件和數據庫中。
5. 一個session持久化的例子:
5.1 定義User:
package com.mycompany.context.beans;
public class User {
private String name;
public User()
{
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.2 定義SerializableUser
package com.mycompany.context.beans;
import java.io.Serializable;
public class SerializableUser implements Serializable {
private String name;
public SerializableUser(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.3 定義Servlet:
package com.mycompany.context.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.mycompany.context.beans.SerializableUser;
import com.mycompany.context.beans.User;
public class SessionTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setHeader("Pragma", "No-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0);
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
session.setAttribute("user", new User("zhang"));
out.println("在session中加入了User對象。");
} else {
out.println("User對象爲:" + user.getName());
}
SerializableUser suser = (SerializableUser) session
.getAttribute("suser");
if (suser == null) {
session.setAttribute("suser", new SerializableUser("zhang1"));
out.println("在session中加入了SerializableUser對象。");
} else {
out.println("SerializableUser對象爲:" + suser.getName());
}
}
}
測試的過程是,首先訪問這個Servlet,顯示爲創建兩個session,然後再刷新,都是顯示兩個session的值。因爲這時候session已經初始化過了。重啓tomcat後,訪問這個Servlet,發現顯示爲:創建了User,顯示了SerializableUser。這說明SerializableUser被持久化了,但是User沒有。因爲User沒有實現Serializable接口。