会话的概念
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话。
保存会话数据的两种技术(cookie和session)
1.Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
使用cookie记录用户上一次访问时间
1 package gac.xdp.cookie;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.util.Date;
6 import javax.servlet.ServletException;
7 import javax.servlet.http.Cookie;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 /**
13 * @author 杨
14 * cookie实例:获取用户上一次访问的时间
15 */
16 public class CookieDemo01 extends HttpServlet {
17
18 public void doGet(HttpServletRequest request, HttpServletResponse response)
19 throws ServletException, IOException {
20 //设置服务器端以UTF-8编码进行输出
21 response.setCharacterEncoding("UTF-8");
22 //设置浏览器以UTF-8编码进行接收,解决中文乱码问题
23 response.setContentType("text/html;charset=UTF-8");
24 PrintWriter out = response.getWriter();
25 //获取浏览器访问访问服务器时传递过来的cookie数组
26 Cookie[] cookies = request.getCookies();
27 //如果用户是第一次访问,那么得到的cookies将是null
28 if (cookies!=null) {
29 out.write("您上次访问的时间是:");
30 for (int i = 0; i < cookies.length; i++) {
31 Cookie cookie = cookies[i];
32 if (cookie.getName().equals("lastAccessTime")) {
33 Long lastAccessTime =Long.parseLong(cookie.getValue());
34 Date date = new Date(lastAccessTime);
35 out.write(date.toLocaleString());
36 }
37 }
38 }else {
39 out.write("这是您第一次访问本站!");
40 }
41
42 //用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
43 Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//创建一个cookie,cookie的名字是lastAccessTime
44 //将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
45 response.addCookie(cookie);
46 }
47
48 public void doPost(HttpServletRequest request, HttpServletResponse response)
49 throws ServletException, IOException {
50 doGet(request, response);
51 }
52
53 }
2.Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
使用session存储用户信息
1 package xdp.gacl.session;
2
3 import java.io.IOException;
4 import javax.servlet.ServletException;
5 import javax.servlet.http.HttpServlet;
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8 import javax.servlet.http.HttpSession;
9
10 public class SessionDemo1 extends HttpServlet {
11
12 public void doGet(HttpServletRequest request, HttpServletResponse response)
13 throws ServletException, IOException {
14
15 response.setCharacterEncoding("UTF=8");
16 response.setContentType("text/html;charset=UTF-8");
17 //使用request对象的getSession()获取session,如果session不存在则创建一个
18 HttpSession session = request.getSession();
19 //将数据存储到session中
20 session.setAttribute("data", "鲁班");
21 //获取session的Id
22 String sessionId = session.getId();
23 //判断session是不是新创建的
24 if (session.isNew()) {
25 response.getWriter().print("session创建成功,session的id是:"+sessionId);
26 }else {
27 response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);
28 }
29 }
30
31 public void doPost(HttpServletRequest request, HttpServletResponse response)
32 throws ServletException, IOException {
33 doGet(request, response);
34 }
35 }
3.Session和Cookie的主要区别
对比项 | Cookie | HttpSession |
存储位置 | 存放在客户端 | 存放在服务器 |
存储容量 | 单个cookie保存的数据<=4k,一个站点最多保存20个Cookie | 没有上限,但出于服务器性能考虑,session内不要存放过多东西 |
存储方式 | 只能保管ASCII字符串,并且需要通过编码方式存储为Unicode字符或者二进制数据 | 能存储任何类型的数据 |
隐私策略 | 对客户端可见,明文保存,不安全 | 存储在服务器上,安全 |
有效期 | 通过设置cookie的属性,达到长期有效 | 关闭窗口,session就会失效 |
服务器压力 | 保存在客户端,不占用服务器资源 | 保存在服务器端,每个用户都会产生一个cookie,耗费大量内存 |
跨域支持 | 支持跨域名访问 | 不支持跨域名访问 |