web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。一个session只为一个会话服务,只为一个浏览器服务。所以,即使代码相同,但不同浏览器得到的是各自的数据,创建的是各自不同的session。
session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
session和cookie的区别:
cookie是把用户的数据写给用户的浏览器(写在浏览器)。
session技术把用户的数据写到用户独占的session中(写在服务器)。
session实现原理(一个session只为一个用户浏览器服务):
浏览器a访问servlet1,若服务器未为浏览器a创建session,则调用getSession方法为浏览器a创建一个session,每个session创建后都有一个id号,服务器将session的id号以cookie的形式回写给浏览器,下次浏览器访问服务器时就会带着这个id号,来告诉服务器需要使用的session。(session是基于cookie的);
一个新的浏览器b去访问服务器,因为没有id号,表明服务器没有为浏览器b创建过session,那么服务器就会为它创建一个session,将session的id号以cookie形式写回浏览器b。
但是,在其中有一个问题,服务器将session的id号以cookie的形式回写给浏览器,而cookie是没有设置有效期的,即浏览器关闭后,cookie就没有了,意味着浏览器下次访问服务器,服务器就会创建一个新的session,没有保存之前的数据。那么我们就要为cookie设置一个有效期:
例:
创建一个1.html:
<!DOCTYPE html>
<html>
<head>
<title>1.html</title>
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<a href="/day07/SessionDemo1">购买</a>
<a href="/day07/SessionDemo2">结账</a>
</body>
</html>
创建一个servlet:SessionDemo1(购买servlet)
package cn.sun.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//购买Servlet
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public SessionDemo1() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(); //得到用户的session
//为cookie设置有效期
String sessionid=session.getId(); //得到session的ID
Cookie cookie=new Cookie("JSESSIONID",sessionid); //回写一个与服务器回写的cookie同名的cookie,将其覆盖(就是覆盖服务器回写的cookie)。注:服务器回写的session的名称叫JSESSIONID
cookie.setPath("/day07"); //设置相同的path将其覆盖
cookie.setMaxAge(30*60); //设置有效期为30分钟
response.addCookie(cookie); //回写session
session.setAttribute("name", "洗衣机"); //存储用户购买的物品
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
创建一个servlet:SessionDemo2(结账servlet)
package cn.sun.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//结账servlet
@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
public SessionDemo2() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
HttpSession session = request.getSession(); //得到来访者的session
String product = (String) session.getAttribute("name"); //得到用户购买的产品
out.write("您购买的商品是:"+product);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
运行:
点击购买,再返回该界面,然后点击结账:
现在关闭浏览器,重新打开一个新的浏览器,来看看是否改变了cookie的有效期:
直接点击结账:
关闭浏览器后,服务器没有重新创建session对象,说明以cookie形式写回的id仍然存在。
session对象的生命周期:
session的创建:是第一次去执行getSession这个代码时,服务器才会创建一个session。
session的消亡:默认30分钟内未使用session,服务器就会自动摧毁这个session(session对象由服务器管理)。
控制session摧毁的时间:
1、在web.xml中配置:这里以分钟为单位,表示10分钟内未使用session,则摧毁
<session-config>
<session-timeout>10</session-timeout>
</session-config>
2、在代码中摧毁session:如在上例代码中添加下面这句代码,就表示摧毁一个session
session.invalidate();
引申:
request.getSession(boolean create)这个重载方法,表示是否创建session:
例:request.getSession(false):不创建session,只获取session,一般在显示购物车的时候使用这个代码。