会话技术(Cookie和Session)的基本理解

会话技术可以简单理解成浏览器和服务器之间的沟通互动,并且可以用某种方式来将会话中的一些关键数据保存起来。

一次会话中包含多次请求和响应,从浏览器第一次给服务器资源发送请求时会话开始建立,直到一方断开(浏览器被关闭或者服务器被关闭)为止。

在java中,会话技术分为两种:

1、客户端会话技术Cookie:把数据存到客户端

2、服务端会话技术Session:把数据存到服务端


Cookie 

Cookie实际上是一小段的文本信息(key-value格式)。我们知道,HTTP协议本身是无状态的,什么是无状态呢,即服务器无法判断用户身份。那怎么来判断用户身份呢?

客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

使用步骤:

  • 浏览器向服务器请求对应资源
  • 服务端接收请求,在做出响应时,可以创建Cookie
  • 服务端通过响应向浏览器发送Cookie对象
  • 客户端会保存Cookie中的数据,并在之后的会话请求中携带者Cookie
  • 在下一次的请求中服务端会获取Cookie,拿到数据,进行一些识别,这样就实现了数据在多个请求响应之间的共享。

服务端响应Cookie具体过程如下:

1、new一个Cookie对象,参数传递Cookie的名称和对应的数据值。

2、发送Cookie:response.addCookie(Cookie cookie)

3、在下一次请求中获取Cookie:Cookie[] cookies = request.getCookies(),返回的是一个对象数组。可以分别用getName和getValue方法来获取具体的键和值。获取之前最好判断一下是否为空。

比如下方创建两个Servlet,先访问A获取返回的Cookie,然后携带着这个Cookie去访问B,B中获取Cookie进行相应处理,示例如下:

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("usernmae","jackson");
        response.addCookie(cookie);
    }
}

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getValue());
            }
        }
    }
}

 原理如下:

会话技术(Cookie和Session)的基本理解_第1张图片

对应的响应头Set-Cookie如下:

会话技术(Cookie和Session)的基本理解_第2张图片

可以一次创建多个Cookie对象,使用addCookie多次发送Cookie即可,每个Cookie对象都会有一个单独的Set-Cookie响应头。

会话技术(Cookie和Session)的基本理解_第3张图片

对应的请求头Cookie如下:

会话技术(Cookie和Session)的基本理解_第4张图片

多个键值对用分号隔开。

cookie属性项

属性项 属性项介绍
NAME=VALUE 键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样
Expires 过期时间,在设置的某个时间点后该 Cookie 就会失效
Domain 生成该 Cookie 的域名,如 domain="www.baidu.com"
Path 该 Cookie 是在当前的哪个路径下生成的,如 path=/wp-admin/
Secure 如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie

Cookie在浏览器中能保存多久呢?

默认情况下,当浏览器关闭,Cookie数据就会被销毁。

Cookie类中有一个持久化存储的方法setMaxAge(int time)可以进行设置,int型参数有三种取值:

1、正数:将Cookie信息存到本地文件中,但是也代表着本地文件的存活时间(单位默认为秒)。

2、负数:默认值

3、零:自动删除Cookie信息,不会保存,就算先设置正数在本地文件中保存了,再设置成零也会删除。

 Cookie能不能存中文呢?

tomcat8之后可以,tomcat8之前的不可以。但是也只支持Cookie的value值为中文,但对于特殊字符不支持,可以用URL编码。

如果用的是8之前的版本,在传输中文时可以将中文进行编码,通常用URL编码。

在URLEncoder类中有一个静态方法encode,参数传递要编码的字符串和字符集。然后在输出时,还需要解码,用URLDecoder类中的静态方法decode。

Cookie的共享范围有多大呢?

默认情况下,Cookie是不能在一个服务器下的多个web项目之间共享的。

在Cookie类中,有一个设置共享范围的方法setPath(String path),该方法默认设置的是当前web项目的虚拟目录。参数可以传递“/”,那么就可以在当前服务器的不同web项目之间进行数据共享了。

要想在不同的服务器之间还能进行Cookie共享,可以调用setDomain(String path)方法,只要设置一级域名相同,那么多个服务器之间cookie可以共享。比如:setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中的cookie可以共享。

Cookie的特点和作用

特点:

1、cookie数据存储在客户端浏览器,相对没那么安全。

2、浏览器对单个cookie的大小有限制(4kb),对同一个域名下的cookie总数量也有限制(通常为20个左右)。

作用:

1、通常用于存储少量的不太敏感的数据。

2、在不登陆的情况下,完成服务器对客户端的身份识别,服务端可以识别Cookie中的身份信息。


Session

服务器端会话技术,在一次会话的多次请求之间共享数据,将数据保存在服务器端的对象中。

主要涉及的类是HttpSession,在HttpSession类中,有三个常用的方法:

1、void setAttribute(String name,Object value),保存数据

2、Object getAttribute(String name),获取共享的数据

3、void removeAttribute(String name),移除共享的数据

如何获取HttpSession对象?通过request对象调用getSession方法即可获取。

原理如下

会话技术(Cookie和Session)的基本理解_第5张图片

Session的实现是依赖于Cookie的。第一次访问时,(只要服务器端有创建HttpSession对象相关的动作)会自动响应一个关于session的的响应头,用于下一次访问时的标记。

会话技术(Cookie和Session)的基本理解_第6张图片

如果下一次访问时带着这个JSESSIONID的Cookie,服务器就会去找有没有这个JSESSIONID对应的HttpSession对象,如果有,就会获取这一个了,这样就能保证是同一个HttpSession对象在共享数据。

会话技术(Cookie和Session)的基本理解_第7张图片

Session的一些细节

当客户端关闭后,服务端不关闭,两次获取的HttpSession对象是不是同一个?默认情况下不是。

如果需要是同一个,则需要创建一个Cookie,键为JSESSIONID,值为需要确定的HttpSession对象的id号,并设置该Cookie的最大存活时间。

假如我就希望重新打开浏览器后访问的还是以下这个id的HttpSession

会话技术(Cookie和Session)的基本理解_第8张图片

那么,我可以做如下操作:

会话技术(Cookie和Session)的基本理解_第9张图片

客户端不关闭,服务端关闭,两次获取的session是不是同一个?

默认情况下不是,因为服务器一旦关闭,原来的哪个session将会被销毁。这样会存在一些问题,假如我去京东买一些东西,并将这些东西加入购物车,突然京东的服务器重启了一下,那么之前购物车里的数据就会丢失了。

所以,虽然不是同一个,但是要保证数据不会丢失这里就要涉及到下面两个技术。

1、session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上。

2、session的活化:服务器重启后,将session文件反序列化为内存中的session对象。

tomcat会自动帮我们做这件事。有个问题了解下,idea中可以钝化,但无法实现活化。

session的失效时间是?即session对象什么情况下会被销毁。

1、服务器关闭

2、session对象调用自杀方法invalidate()

3、session有一个默认失效时间是30分钟,即如果30分钟不做任何操作,就会自动销毁。这个值可以在tomcat中的父web.xml中的session-config标签中设置

Session的特点

Session用于存储一次会话中多次请求间的数据,存在服务端。

Session可以存储任意类型,任意大小的数据。

你可能感兴趣的:(WEB)