Session和Cookie

Session和Cookie

关于网络编程中的会话,维基百科是这样解释的:

在计算机科学领域来说,尤其是在网络领域,会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
在不包含会话层(例如UDP)或者是无法长时间驻留会话层(例如HTTP)的传输协议中,会话的维持需要依靠在传输数据中的高级别程序。例如,在浏览器和远程主机之间的HTTP传输中,HTTP cookie就会被用来包含一些相关的信息,例如session ID,参数和权限信息等。

从这段话中可以得知,会话是用户或者客户端和服务端保持的一种“连接”。这种连接一般始于打开浏览器访问某个网址,到关闭浏览器或者关闭对于这个网站的访问。期间对于这个网站的多次请求,都属于同一个会话。比如我们在再次登录一个网站的时候,一般是不用再次输入用户名的;在访问网站期间,也不用反反复复输入密码进行验证;在购物类网站浏览时,网站可以记住我们之前添加进购物车或者浏览过的商品等,都是会话的应用范畴。

会话分为服务端的会话和客户端的会话,在服务端的会话一般采用的就是session,在客户端的会话一般采用的就是cookie。session和cookie并不是完全独立的,session往往都是依赖于cookie。

Cookie

Cookie又称“小甜饼”,是一种小型文本文件,某些网站为了辨识用户身份而存储在用户本地的数据,由网景公司在1993年3月发明。

因为HTTP协议是无状态的,服务器是不知道用户上一次做了什么操作,从安全角度来讲,对服务器的每一次请求都应该要经过权限的验证。如果采取这样的操作,应该会把用户累死。采用Cookie的机制,浏览器可以把本地的包含了服务端存储信息的Cookie发送给服务器,服务器可以从中取出所需要的信息,不用反复进行一些验证,

Cookie可分为内存Cookie和硬盘Cookie,内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。

Cookie也存在一些缺陷:

  • Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
  • 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS。
  • Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。

java中的Cookie

Cookie由服务器创建,由键值对的方式存放内容:

Cookie cookie = new Cookie(key,value);

可以通过Cookie的源码可以看到:

public Cookie(String name, String value) {
    validation.validate(name);
    this.name = name;
    this.value = value;
}

Cookie中常用的几个方法如下:
1.设置Cookie的值

Cookie一旦创建好了,就不能再增加别的键值对,只能修改其中的内容

public void setValue(String newValue) {
    this.value = newValue;
}

2.获取Cookie的值

public String getValue() {
    return this.value;
}

3.设置Cookie的有效时间

默认关闭浏览器后,Cookie就没用了,expiry单位是秒

  • expiry=-1:代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了。
  • expiry>0:代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时间过期才会被浏览器自动删除,
  • expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被浏览器给删除。
public void setMaxAge(int expiry) {
    this.maxAge = expiry;
}

4.设置Cookie的路径

public void setPath(String uri) {
    this.path = uri;
}

当设置路径为("/")时,该域名下的所有项目都可以获取到Cookie,这时就可以实现单点登录了。

注意,Cookie不支持中文,除非采用编码上的处理。

Session

Cookie可以让服务器跟踪每个客户端的访问,但是如果每次访问都要传输这些Cookie,无形中就增加了数据传输量;而且,处于保护隐私的原因,有些用户会在禁止浏览器使用Cookie,Session的出现正是为了解决这些问题。

浏览器访问服务器时,服务器首先会检查浏览器的请求是否包含一个session标识,称为sessionID,如果服务器已经有了这个标识,代表已经为此用户创建过session,服务器就按照这个sessionID找出session使用;如果不包含sessionID,则服务器为此用户创建一个session,并把这个sessionID返回到客户端保存。此时,就可以使用cookie保存sessionID。下次访问时就可以使用这个session。

保存session的方式不仅仅是cookie一种,当用户禁用Cookie之后,还有两种方式保存Session信息:

  • 基于URL PATH Parameter,默认支持
  • 基于SSL,,默认不支持,只有connector.getAttribute(“SSLEnabled”)为true时才支持

java中的Session

1.获取session

javax.servlet.http.HttpServletRequest#getSession()
// 如果没有session,则创建一个session返回
javax.servlet.http.HttpServletRequest#getSession(boolean)

2.session属性操作

// 返回指定名称的对象
javax.servlet.http.HttpSession#getAttribute(String name)
// 返回保存在session中的所有信息
javax.servlet.http.HttpSession#getAttributeNames()
// 将信息以键值对的形式保存进session中
javax.servlet.http.HttpSession#setAttribute(String name, Object value)

3.销毁session

javax.servlet.http.HttpSession#invalidate()

4.设置session有效时间,单位是秒

javax.servlet.http.HttpSession#setMaxInactiveInterval(int interval)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值