Servlet之Cookie和Session

会话技术

在了解cookie和session之前,需要先了解一个概念:会话

1. 概念

在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。web应用中的会话过程类似于生活中的打电话过程,它指的是客户端(浏览器)与web服务器之间连续发生的一系列请求和响应的过程。例如:一个用户在某个网站上的整个购物过程就是一个会话。

2. HttpServletRequest对象和ServletContext

HttpServletRequest对象和ServletContext都可以对数据进行保存,但是针对下面所描述的需求就不可行:

用户甲和乙分别登录购物网站,甲在购物车中添加了一个iphone手机,乙在购物车中添加了一个Ipad平板,这时web服务器需要对用户甲和用户乙的信息分别进行保存。

HttpServletRequest对象存储为什么不能实现该需求呢?

客户端请求web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买的数据会丢失。

ServletContext对象为什么不能实现改需求呢

使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中的所有用户购买的商品进行结算,这显然也是不行的。

Cookie和Session

为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。

3. 会话跟踪
1. 概念

        当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息会保存在Cookie中。这样,当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
        服务器向客户端发送Cookie时,会在HTTP响应头中增加Set-Cookie响应头信息。Set-Cookie头字段中设置的Cookie遵循一定的语法格式,具体如下:

Set-cookie: user=itcast;Path=/;

在上述事例中:user表示Cookie的名称,itcast表示Cookie的值,Path表示Cookie的属性。
注意:Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号;和空格分隔。

传输过程可用如下图表示:
这里写图片描述

如上图:Cookie的工作原理可这样描述

1)首先浏览器向服务器发出请求。

2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。

3)然后把该Cookie对象放在响应头,一并发送回浏览器。

4)浏览器接收服务器响应后,提出该Cookie保存在浏览器端。

5)当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。

6)服务器从请求头提取出该Cookie,判别里面的数据,然后作出相应的动作。

(1)增加Cookie

//1:创建一个Cookie对象 ,只能存非中文的字符串
Cookie cookie1 = new Cookie("name", "liutao");
Cookie cookie2 = new Cookie("age", "35");
//2:将生成的Cookie发送到浏览器
 response.addCookie(cookie1);
 response.addCookie(cookie2);

(2)获取Cookie

Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
    System.out.println(cookie.getName()+" " + cookie.getValue());
}

(3)设置Cookie中文:URLEncoder(编码),URLDecoder(解码)

  • URLEncoder.encode(“刘涛”, “UTF-8”);//编码
  • URLDecoder.decode(cookie.getValue(), “UTF-8”);//解码

添加Cookie

//对中文进行编码
String str = URLEncoder.encode("刘涛", "UTF-8");
Cookie cookie = new Cookie("username", str); //"%ED%AC%11%FE" URL编码
response.addCookie(cookie);

获取Cookie

Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
    //对中文进行解码
    String str = URLDecoder.decode(cookie.getValue(), "UTF-8");
    System.out.println(cookie.getName()+" " + str);
}

(4)设置Cookie持久化时间

  • cookie.setMaxAge(60*60*24*365*100);
Cookie cookie = new Cookie("username", "baoqiang");
/*
 * 1:默认情况下,Cookie的声明周期是从发送Cookie到浏览器结束
 * 2:如果要对Cookie持久化,必须设置Cookie的存活时间,则Cookie存到硬盘中
 *   setMaxAge(expiry) 单位是秒
 * 3:如果持久化了之后,浏览器关闭之后重启可以重新获取
 */
cookie.setMaxAge(60*60*24*365*100); //单位是秒
response.addCookie(cookie);

(5)设置Cookie作用域

  • cookie.setPath()

设置Cookie作用域

Cookie cookie = new Cookie("username", "baoqiang");
//设置Cookie访问路径:path

//1:只要访问同一个Tomcat中所有的项目资源,都会携带Cookie
cookie.setPath("/");
//2:只要访问我当前项目中的所有资源,都会携带Cookie1
cookie.setPath("/day33_01_cookie_session/");
//3:只要访问我当前项目中的abc目录下所有资源,都会携带Cookie
cookie.setPath("/day33_01_cookie_session/abc");

//cookie.setPath(request.getContextPath());
response.addCookie(cookie);

获取不同的作用域下的Cookie

浏览器向客户端访问对应目录下的资源或接口时,会获取到不同的Cookie
客户端请求:

//获取服务端设置有"/day33_01_cookie_session/"的Cookie
localhost:8080/day33_01_cookie_session
//获取服务端设置有"/day33_01_cookie_session/abc"的Cookie
localhost:8080/day33_01_cookie_session/abc

(6)删除Cookie

//清除Cookie
Cookie cookie = new Cookie("username", "");
//1:设置访问的路径path,  这里的Path必须和设置Cookie 的路径保持一致
cookie.setPath(request.getContextPath());
//2:设置存活时间
cookie.setMaxAge(0);
//3:将cookie发送到浏览器
response.addCookie(cookie);

Session

1. Session概念

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。

当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
注意:由于客户端需要接受、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
过程如下:
这里写图片描述
那么Session技术的原理是什么,它是如何工作的呢?

1)浏览器发出请求到服务器。
2)服务器会根据需求生成Session对象,并且给这个Session对象一个编号,一个编号对应一个Session对象
3)服务器把需要记录的数据封装到这个Session对象里,然后把这个Session对象保存下来。
4)服务器把这个Session对象的编号放到一个Cookie里,随着响应发送给浏览器
5)浏览器接收到这个cookie就会保存下来
6)当下一次浏览器再次请求该服务器服务,就会发送该Cookie
7)服务器得到这个Cookie,取出它的内容,它的内容就是一个Session的编号!!!
8)凭借这个Session编号找到对应的Session对象,然后利用该Session对象把保存的数据取出来!

2. Session操作和API(方法介绍)

添加Session

//1: 创建Session对象,并设置值
HttpSession session = request.getSession(); //服务器上map集合
session.setAttribute("username", "liutao");

获取Session

//获取Session
HttpSession session = request.getSession();
Object username = session.getAttribute("username");
System.out.println("username:"+username);

获取Session编号ID

String id = session.getId(); //获取Session的编号Id
3. Session的生命周期

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

4. Session的有效期

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。

Session的超时时间也可以在Tomcat的config目录下的web.xml中修改。

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

另外,通过调用Session的invalidate()方法可以使Session失效。

5.Session对浏览器的要求

虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。

因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

5. URL重写

暂无

Cookie和Session

1. Cookie和Session的区别

从存储方式上比较

  • Cookie只能存储字符串,如果要存储非ASCII字符串还要对其编码; Session可以存储任何类型的数据,可以把Session看成是一个容器
  • cookie数据存放在客户的浏览器上,session数据放在服务器上;
  • 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

从隐私安全上比较

  • Cookie存储在浏览器中,对客户端是可见的。信息容易泄露出去。如果使用Cookie,最好将Cookie加密
  • Session存储在服务器上,对客户端是透明的。不存在敏感信息泄露问题。

从有效期上比较

  • Cookie保存在硬盘中,只需要设置maxAge属性为比较大的正整数,即使关闭浏览器,Cookie还是存在的
  • Session的保存在服务器中,设置maxInactiveInterval属性值来确定Session的有效期。并且Session依赖于名为JSESSIONID的Cookie,该Cookie默认的maxAge属性为-1。如果关闭了浏览器,该Session虽然没有从服务器中消亡,但也就失效了。

从对服务器的负担比较

  • Session是保存在服务器的,每个用户都会产生一个Session,如果是并发访问的用户非常多,是不能使用Session的,Session会消耗大量的内存。
  • Cookie是保存在客户端的。不占用服务器的资源。像baidu、Sina这样的大型网站,一般都是使用Cookie来进行会话跟踪。

从浏览器的支持上比较

  • 如果浏览器禁用了Cookie,那么Cookie是无用的了!
  • 如果浏览器禁用了Cookie,Session可以通过URL地址重写来进行会话跟踪。

从跨域名上比较

  • Cookie可以设置domain属性来实现跨域名
  • Session只在当前的域名内有效,不可夸域名
2. Session和Cookie共同使用

暂无

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值