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