http协议是无状态协议 

无状态协议的意思是服务端与客户端不会记录任何一次通信的信息

服务端”和“客户端”,虽然见过很多面,但每次见面仍还是认不出对方,都是陌生人。

但是,有时候认出用户是必须的,如在用户用户登录时,必须能记住用户的登录状态。

session与cookie就是为解决http无状态导致的问题引入的。

session

客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMap。Session 弥补了 HTTP 无状态特性,服务器可以利用 Session 存储客户端

在同一个会话期间的一些操作记录。

服务端的用户信息存储,,等到下次连接的时候,可以查看这个信息,例如:

cookie:

服务端君”根据什么去查字条呢?这就需要cookie

cookie由服务器生成,发送给浏览器,浏览器吧cookie以K-V的形式写入到文本文件内,下一次请求统一网址

会把给cookie发送给服务器

服务端保存在客户端的用户信息

服务端”写了张条子交给“客户端”,让它下次见面时带来

第二次识别过程:

服务端”根据客户端君带来的条子里的序号,翻翻自己的口袋,找出对应的字条,就能识别出眼前的这位“客户端”

服务端”给“客户端”的条子就是cookie,
条子的内容就是session ID。

cookie和session的区别

session是存在服务器端,cookie是存在客户端,所以session的安全性比cookie高

获取session里的信息是通过存放在会话cookie里的sessin id获取。
客户端只要访问的时候在请求头带上sessin id就可以了。 session是存放服务器内存中,所以数据不断增加早餐服务器的负载,所以会把很重要的信息存储session中,
次要的信息存放在客户端

Token

token是多用户下处理认证的最佳方式

无状态 可扩展
支持移动设备
跨程序调用
安全

基于服务器的验证

token生成的过程:

 session如何判断是否是为统一会话

1111服务器第一次接收到请求时,开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId
2222通过响应头的 Set-Cookie:JSESSIONID=XXXXXXX 命令,向客户端发送要求设置 Cookie 的响应
3333客户端收到响应后,在本机客户端设置了一个 JSESSIONID=XXXXXXX 的 Cookie 信息,该 Cookie 的
过期时间为浏览器会话结束。

流程图:

接下来客户端每次向同一个网站发送请求时,请求头都会带上该 Cookie 信息(包含 sessionId ), 然后,服务器通过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。

Cookie记录用户访问次数:
Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。

可以通过操作Cookie对象对客户端Cookie进行操作。

java获取cookie方法 request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回)

通过response.addCookie(Cookiecookie)向客户端设置Cookie

Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie

Cookie不可跨域名性

根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,
从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,
因此Google不能操作Baidu的Cookie。

Cookie的Unicode编码,保存中文

中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。

Cookie的属性

属  性  名

描    述

String name

该Cookie的名称。Cookie一旦创建,名称便不可更改

Object value

该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码

int maxAge

该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1

boolean secure

该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false

String path

该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”

String domain

可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”

String comment

该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明

int version

该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

Servlet Cookie的使用方法

设置Cookie的域名domain:

正常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。

如果需要共同使用该Cookie

需要设置Cookie的domain参数,例如:

cookie.setDomain(".helloweenvsfei.com");           // 设置域名

设置Cookie的路径

domain属性决定运行访问Cookie的域名,而path属性决定允许访问Cookie的路径(ContextPath)

如果只允许/quan/路径下的程序使用Cookie

cookie.setPath("/quan/");     

设置为“/”时允许所有路径使用Cookie。path属性需要使用符号“/”结尾

注意:页面只能获取它属于的Path的Cookie。例如/session/test/a.jsp不能获取到路径为/session/abc/的Cookie。

设置Cookie的安全性

secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。

Session的生命周期:

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

只访问HTML、IMAGE等静态资源并不会创建Session

Session的有效期:
防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,
通过setMaxInactiveInterval(longinterval)修改。   Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法
可以使Session失效。

Session常用方法:

方  法  名

描    述

void setAttribute(String attribute, Object value)

设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大

String getAttribute(String attribute)

返回Session属性

Enumeration getAttributeNames()

返回Session中存在的属性名

void removeAttribute(String attribute)

移除Session属性

String getId()

返回Session的ID。该ID由服务器自动创建,不会重复

long getCreationTime()

返回Session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime())

long getLastAccessedTime()

返回Session的最后活跃时间。返回类型为long

int getMaxInactiveInterval()

返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效

void setMaxInactiveInterval(int second)

设置Session的超时时间。单位为秒

void putValue(String attribute, Object value)

不推荐的方法。已经被setAttribute(String attribute, Object Value)替代

Object getValue(String attribute)

不被推荐的方法。已经被getAttribute(String attr)替代

boolean isNew()

返回该Session是否是新创建的

void invalidate()

使该Session失效

最新文章

  1. 编译原理-词法分析05-正则表达式到DFA-01
  2. Linux学习一:安装/配置vi,熟悉gcc/vi
  3. LINQ语句
  4. iOS中事件的传递和响应者链条
  5. 性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧
  6. Linux之正则表达式
  7. go golang 笔试题 面试题 笔试 面试
  8. TCP/IP、HTTP、HTTPS、HTTP2.0
  9. 关于 promise 吃到错误的理解
  10. HttpWebRequest请求Https协议的WebApi
  11. 设计模式——proxy代理模式
  12. python __name__ 和__main__的使用领悟
  13. XAMPP+composer+laravel+thinkphp5那些深情的往事
  14. eclipse 安装python后pydev不出现
  15. SSIS系列文章收藏
  16. 12月14日 bs-grid , destroy_all()
  17. .net 外部CSS文件不起作用总结
  18. ORA-01034:Oracle not available
  19. OpenERP7.0中日期的问题
  20. Maven(一)-- 基础知识

热门文章

  1. 学逆向之web_local
  2. HTTP攻击与防范-跨站攻击-01简介
  3. 密码破解工具Brutus
  4. vim编辑以及脚本编程练习
  5. selenium+python自动化106 - 滑动 iframe 上的滚动条
  6. c语言刷 链表题记录
  7. 普通web整合quartz跑定时任务
  8. 微服务从代码到k8s部署应有尽有系列(十三、服务监控)
  9. STP详解-STP、RSTP、MSTP
  10. html2canvas滚动截图