HTTP协议与状态保持:Http是一个无状态协议
1. 实现状态保持的方案:
1)修改Http协议,使得它支持状态保持(难做到)
2)Cookies:通过客户端来保持状态信息
Cookie是服务器发给客户端的特殊信息
cookie是以文本的方式保存在客户端,每次请求时都带上它
3)Session:通过服务器端来保持状态信息
Session是服务器和客户端之间的一系列的交互动作
服务器为每个客户端开辟内存空间,从而保持状态信息
由于需要客户端也要持有一个标识(id),因此,也要求服务器端和客户端传输该标识,
标识(id)可以借助Cookie机制或者其他的途径来保存
2. COOKIE机制
1)Cookie的基本特点
Cookie保存在客户端
只能保存字符串对象,不能保存对象类型
需要客户端浏览器的支持:客户端可以不支持,浏览器用户可能会禁用Cookie
2)采用Cookie需要解决的问题
- Cookie的创建
通常是在服务器端创建的(当然也可以通过javascript来创建) 服务器通过在http的响应头加上特殊的指示,那么浏览器在读取这个指示后就会生成相应的cookie了
- Cookie存放的内容
业务信息("key","value")
过期时间
域和路径
浏览器是如何通过Cookie和服务器通信?
通过请求与响应,cookie在服务器和客户端之间传递
每次请求和响应都把cookie信息加载到响应头中;依靠cookie的key传递。
3. COOKIE编程
1)Cookie类
Servlet API封装了一个类:javax.servlet.http.Cookie,封装了对Cookie的操作,包括:
public Cookie(String name, String value) //构造方法,用来创建一个Cookie
HttpServletRequest.getCookies() //从Http请求中可以获取Cookies
HttpServletResponse.addCookie(Cookie) //往Http响应添加Cookie
public int getMaxAge() //获取Cookie的过期时间值
public void setMaxAge(int expiry) //设置Cookie的过期时间值
2)Cookie的创建
Cookie是一个名值对(key=value),而且不管是key还是value都是字符串
如: Cookie visit = new Cookie("visit", "1");
3)Cookie的类型——过期时间
会话Cookie
Cookie.setMaxAge(-1);//负整数
保存在浏览器的内存中,也就是说关闭了浏览器,cookie就会丢失
普通cookie
Cookie.setMaxAge(60);//正整数,单位是秒
表示浏览器在1分钟内不继续访问服务器,Cookie就会被过时失效并销毁(通常保存在文件中)
注意:
cookie.setMaxAge(0);//等价于不支持Cookie;
4. SESSION机制
session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。
服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。
这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:
如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。
每次客户端发送请求,服务断都检查是否含有sessionId。
如果有,则根据sessionId检索出session并处理;如果没有,则创建一个session,并绑定一个不重复的sessionId。
1)基本特点
状态信息保存在服务器端。这意味着安全性更高
通过类似与Hashtable的数据结构来保存
能支持任何类型的对象(session中可含有多个对象)
2)保存会话id的技术
- Cookie
这是默认的方式,在客户端与服务器端传递JSeesionId 缺点:客户端可能禁用Cookie 表单隐藏字段 在被传递回客户端之前,在 form 里面加入一个hidden域,设置JSeesionId:
<input type=hidden name=jsessionid value="3948E432F90932A549D34532EE2394" />
- URL重写
直接在URL后附加上session id的信息
HttpServletResponse对象中,提供了如下的方法:
encodeURL(url); //url为相对路径
5. SESSION编程
1)HttpSession接口
Servlet API定义了接口:javax.servlet.http.HttpSession, Servlet容器必须实现它,用以跟踪状态。
当浏览器与Servlet容器建立一个http会话时,容器就会通过此接口自动产生一个HttpSession对象
2)获取Session
HttpServletRequest对象获取session,返回HttpSession:
request.getSession(); //表示如果session对象不存在,就创建一个新的会话
request.getSession(true); //等价于上面这句;如果session对象不存在,就创建一个新的会话
request.getSession(false); //表示如果session对象不存在就返回 null,不会创建新的会话对象
3)Session存取信息
session.setAttribute(String name,Object o) //往session中保存信息
Object session.getAttribute(String name) //从session对象中根据名字获取信息
4)设置Session的有效时间
public void setMaxInactiveInterval(int interval)
设置最大非活动时间间隔,单位秒;
如果参数interval是负值,表示永不过时。零则是不支持session。
通过配置web.xml来设置会话超时,单位是分钟
<seesion-config>
<session-timeout>1</session-timeout>
</session-config>
- 允许两种方式并存,但前者优先级更高
5)其他常用的API
6. Cookie和Session跟踪机制的比较
Cookie Session
保持在客户端 保存在服务器端
只能保持字符串对象 支持各种类型对象
通过过期时间值区分Cookie的类型 需要sessionid来维护与客户端的通信
会话Cookie——负数 Cookie(默认)
普通Cookie——正数 表单隐藏字段
不支持Cookie——0 url重写
应用领域:web交易需要保存状态的时候,都可以使用,比如在分布式场景下可以利用分布式session技术等。
7.token
token的意思是“令牌”,是用户身份的验证方式,
最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、
sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。
还可以把不变的参数也放进token,避免多次查库.
8.token 和session 的区别
-
-
-
-
- Session 是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓Session 认证只是简单的把User 信息存储到Session 里,因为SID 的不可预测性,暂且认为是安全的。这是一种认证手段。
- 而Token ,如果指的是OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对App 。其目的是让 某App有权利访问 某用户 的信息。这里的 Token是唯一的。不可以转移到其它 App上,也不可以转到其它 用户 上。
- 转过来说Session 。Session只提供一种简单的认证,即有此 SID,即认为有此 User的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App。
- 所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。
-
-
-
- token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;
- cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;
- session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.
- Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。
参考来源:
https://www.zhihu.com/question/31079651/answer/136106134