会话技术:Cookie 和 Session

会话技术

1、会话:一次会话包含多次请求和响应

2、作用:在一次会话的多次请求间,共享数据

3、方式:
(1)客户端会话技术:Cookie
(2)服务器端会话技术:Session


Cookie

1.概念: 客户端会话技术,将数据保存到客户端(Cookie这个对象是存在客户端的,服务器端可以获取)

2.解释一下这是干嘛的。
  在一次会话期间(浏览器向服务器第一次发出请求起,到任意一方断开连接为止是一次会话,包含了
          多次的请求响应)
  第零,浏览器向服务器端发起请求;
  首先,服务器创建一个会话对象Cookie响应给浏览器;
  然后,浏览器保存这个Cookie;
  最后,浏览器向服务器发送请求时会携带这个对象。(之后的请求头信息都会携带这个cookie数据)

这说明了什么? 不同的请求响应本来是独立的,但是现在不同的请求响应之间共享了数据!!
但是我有个问题,这样的cookie对象是全局的吗?(看下边的细节4,默认当前虚拟目录下都可以获取到)

3.步骤:
(1)服务器的一个servlet页面创建Cookie对象
    Cookie cookie = new Cookie(“username”,“123456”);
(2)将cookie对象发送给浏览器
    response.addCookie(cookie);
(3)服务器请求获取cookie(可以是另一个servlet页面)

	Cookie[] cookies = request.getCookies();
	if(cookies != null) {
    	        for (Cookie cookie : cookies) {
        	        System.out.println(cookie.getValue());
            	}
        	}

4.细节
(1)一次可以发送多个cookie

(2)可以保存多长时间
    1、默认情况下:cookie存在浏览器的内存中。当浏览器关闭时,cookie数据被销毁
    2、持久化存储:

		cookie.setMaxAge(int seconds);
			seconds > 0 ,将cookie数据存储到硬盘中,持久化存储;seconds是cookie的硬盘存活时间(注意,浏览器不关的话,即使过了设置的时间也可以继续访问)
			seconds = 0,删除cookie信息
			seconds < 0, 默认值

(3)Tomcat 8 之后可以存储中文数据

(4)Tomcat的获取范围
    1.一个Tomcat部署的多个项目间,可不可以共享cookie数据?
     *默认情况下,是不可以的。
     *可以设置cookie的获取范围
       setPath(String path) 默认情况下,设置的是当前的虚拟目录
       若想共享,可以设置path为"/"

    2.多个Tomcat服务器之间cookie共享
     setDomain(String path):设置一级域名相同

5.特点和作用
(1)特点:
    *存储在客户端浏览器
    *浏览器对单个cookie的大小有限制,对同一个域名下的总cookie数也有限制

(2)作用:
    1.一般用于存储少量的不太敏感的数据
    2.在不登录的情况下,完成服务器对客户端的身份识别

6.一个例子:
题目:
当浏览器第一次访问时,页面显示消息“欢迎您首次访问本站”;
再次访问时,页面显示消息“欢迎回来,您上次访问本站的时间是”+上次访问时间。

解答:

@WebServlet("/visitedServletDemo1")
			public class ServletDemo1 extends HttpServlet {
			    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			        response.setContentType("text/html;charset=utf-8");
			        Cookie[] cookies = request.getCookies();
			        PrintWriter writer = response.getWriter();
			        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
			        Date date = new Date();
			        String time = format.format(date);
			//        writer.write("您本次访问本站的时间是"+time);
			        Cookie cookie = new Cookie("last_visited_time",time+"");
			        cookie.setMaxAge(3000);
			        if(cookies != null){
			            for (Cookie cookiee : cookies) {
			                String name = cookiee.getName();
			                String value = cookiee.getValue();
			                if(name.equals("last_visited_time")){
			                    writer.write("欢迎回来,您上次访问本站的时间是:"+value);
			                }
			            }
			
			        }else{
			            writer.write("欢迎您首次访问本站");
			        }
			        response.addCookie(cookie);
			
			    }
			
			    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			        doPost(request, response);
			    }
			}
			

Session

1.概念: 服务器端会话技术,存储服务器端的共享数据

2.方法:
(1)setAttribute()
(2)getAttribute()
(3)removeAttribute()

3.步骤:
(1)获取session对象:
    HttpSession session = request.getSession();

(2)放置共享数据:
    session.setAttribute(String name,Object o);

(3)获取session对象:
    HttpSession session = request.getSession();

(4)读取共享数据
    session.getAttribute(String name);

4.原理:
    一次会话获取的是同一个session,所以可以共享数据。

    *怎么保证一次会话中获取的都是同一个session对象呢?
    其实session共享数据技术是建立在cookie之上的。

    在一次会话中,浏览器发起请求
    服务器第一次获取session之后。会判断请求头里有没有session信息。
    如果没有,就会在内存里创建一个新的session对象。
    然后会在响应头中 set-cookie,返回session的id号,浏览器记录这个session的id号。
    之后浏览器的请求头中都会携带该session的id号。

    当服务器又获取session时,会识别到请求头里有session信息。
    就不会在创建session,而是直接使用这个session对象。然后进行获取数据操作啊什么的

    确保了一次会话只有一个session

5.细节
(1)浏览器关闭,服务器不关闭。同一个浏览器,,服务器两次获取的session是同一个吗?
  默认情况下,不是。

  但是可以设置cookie的保存时间,让cookie持久化保存

 Cookie cookie = new Cookie("JSESSIONID",session.getId());  //把原来的set-cookie信息覆盖掉了
 cookie.setMaxAge(300);
 response.addCookie(cookie);

(2)客户端不关闭,服务器关掉,服务器两次获取的session是同一个吗?

  不是同一个,但是要保证数据不会丢失。所以Tomcat会自动进行session的钝化和活化(idea活化不成功)

  session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
  session的活化:在服务器正常启动之后,将session文件转化为内存中的session对象

(3)session销毁时间(3种方法)
  *服务器关闭
  *session调用invalidate()方法
  *默认失效时间 30min

6.特点
(1)存储一次会话多次请求之间的共享数据
(2)可以存储任意类型,任意大小的数据


Cookie和Session的区别

1.session存储在服务器端,cookie存储在浏览器
2.session没有大小限制,没有类型限制。cookie只能存储字符串
3.session 比 cookie 安全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值