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接口。