cookie与session认识

一、区别:

1、存储机制不同

(1)cookie: cookie是客户端会话状态的存储机制,需要用户打开浏览器的cookie支持。由服务器生成并发送给浏览器,且浏览器下次请求将带上该cookie给同一服务器。

(2)session: session是一种服务器端会话机制,它使用类似于哈希表的结构来保存信息。Session 对象存储特定用户会话所需的属性及配置信息,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失。

2、存储的数据不同

(1)Cookie 只能保存 ASCII     

(2)Session 可以直接存储任何Java类对象

3、安全性:

(1)Cookie 安全性不高,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,最好不要写敏感信息,如帐户密码

(2)Session 安全性比较高

4、内存占用:

(1)Cookie 因为保存在客户端,不会对服务器有压力,所以一般用cookie来跟踪客户会话不用session

(2)Session 会在服务器保存设置的时间,当用户多则对应的session就多,会比较占用服务器性能

5、存储数据量:

(1)Cookie 单个cookie保存的数据不能超过4K

(2)Session 可存储的数据大很多

二、cookie常识:

1、Cookie的作用是解决HTTP协议中缺少无状态缺陷的问题。

2、Cookie包含内容:名称、值、到期时间、路径、域。其中路径与域构成了cookie的范围。

3、当Cookie未设置到期时间,则浏览器关闭的时候Cookie生命周期就结束了,此种Cookie称为会话Cookie。会话cookie一般保存在内存中而非硬盘; 当Cookie设置到期时间,浏览器就会把cookie保存到硬盘上,浏览器关闭后再次打开,这些cookie仍然有效直到超过设定的过期时间,此cookie可以在不同的浏览器进程(即两个不同的浏览器)间共享。

4、cookie的创建发送流程:

服务端创建Cookie对象 --> 设置最大时效 --> 将Cookie放入到HTTP响应报头

5、Cookie相关函数说明:

(1)new Cookie(String name, String value)  : 实例化Cookie对象,设置Cookie的名称和cookie的值
(2)setMaxAge(int expiry) :设置Cookie的最大保存时间,不设置maxAge,那么cookie就只在一次会话中有效,一旦用户关闭了浏览器,那么cookie就消失
(3) setDomain(String pattern)  :设置cookie的有效域
(4) getName() :获取Cookie的名字
(5)getValue():获取Cookie的值

6、Cookie函数使用例子如下:

(1)Cookie[] cookies = request.getCookies();    //HttpServletRequest 获取浏览器访问访问服务器时传递过来的cookie数组
(2)response.addCookie(cookie);   //HttpServletResponse将cookie对象添加到response对象中,返回响应给浏览器的时候就会将改cookie给浏览器。
(3) Cookie cookie = new Cookie("test", "hello");    //创建一个名字为test,值为hello的cookie
(4)cookie.setMaxAge(0);  //将cookie的有效期设置为0,则浏览器将删除该cookie
(5) Cookie cookie = new Cookie("userName", URLEncoder.encode("中", "UTF-8"));  //cookie中存中文
(6)URLDecoder.decode(cookies[i].getValue(), "UTF-8")  //cookie中取中文,使用URLDecoder类里面的decode(String s, String enc)进行解码

三、session常识:

1、session的创建

session不是在客户端访问就创建,而是有server端程序调用HttpServletRequest.getSession(true)这样的语句才创建

2、session各函数区别

(1)getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象
(2)getSession(false):当session存在时返回该session,否则不会新建session,返回null

3、session在下列情况下被删除:
(1)程序调用HttpSession.invalidate()
(2)距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
(3)服务器进程被停止

注意:浏览器关闭时session不会删除,其删除与浏览器操作无关心。

四、问题解析:

1、Cookie和Session的配合使用流程:

(1)首先用户第一次发请求给服务器,服务器根据用户信息创建一个对应的Session,请求返回时将该session对应的sessionid(唯一标识)存入Cookie并返回给浏览器,同时 Cookie 记录此 sessionid 属于哪个域名。

(2)接着用户发送第二个请求,服务器根据请求可以获取到对应的Cookie信息,从Cookie信息中可获取到sessionid,再根据sessionid可以查找到对应的Session,如果没找到说明用户未登录或失效,找到 Session 证明用户已经登录。

2、当浏览器禁止了 Cookie,该怎么保证上面整个流程运转:

(1)每次请求中都携带一个 sessionid 的参数,也可以在请求的地址后面拼接,如  abc?sessionid=xxxxxxx

(2)Token 机制,Token 是服务端生成的一串字符串,作为客户端进行请求的一个标识。这个同 Cookie 和 Session 的使用机制类似。当用户第一次登录后,服务器根据提交的用户信息生成一个 Token,响应时将 Token 返回给浏览器,之后浏览器只需带上这个 Token 进行请求数据即可。

3、在分布式系统中,如何做到用户在一个服务器登录,下次请求到其他服务器仍知道该用户登录(分布式 Session问题)。

(1)共享 Session,将用户的 Session 信息使用缓存中间件(如redis)来统一管理,所有服务器都能从该缓存拿到session信息。

(2)Session 复制,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。

4、使用会话记录用户访问次数:

session的属性类型不能使用基本数据类型,但是记录访问次数要用到整形变量,所以我们需要用到基本类型的包装类。即用Integer来表示访问次数,每次请求都必须创建新的Integer对象,再使用setAttribute来代替之前存在的老的属性值。如:

HttpSession session = request.getSession();
Integer value = (Integer)session.getAttribute(“num”);
if (value= =null){
    value = new Integer(1); // 新创建一个不可更改对象
}else{
    value = new Integer(value.intValue()+1); // 对value+1后创建新的对象
}
session.setAttribute(“num”,value);   // 使用新创建的对象覆盖原来的对象

5、解决跨域请求?Jsonp 跨域的原理是什么(网上找的问题)
 

说起跨域请求,必须要了解浏览器的同源策略,同源策略/SOP(Same origin policy)是一种约定。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。

解决跨域请求的常用方法是:

  • 通过代理来避免,比如使用 Nginx 在后端转发请求,避免了前端出现跨域的问题。
  • 通过 Jsonp 跨域
  • 其它跨域解决方案

重点谈一下 Jsonp 跨域原理。浏览器的同源策略把跨域请求都禁止了,但是页面中的 <script><img><iframe>标签是例外,不受同源策略限制。Jsonp 就是利用 <script> 标签跨域特性进行跨域数据访问。

JSONP 的理念就是,与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段 Javascript,在这段 Javascript 代码中调用了约定好的回调函数,并且将数据作为参数进行传递。当网页接收到这段 Javascript 代码后,就会执行这个回调函数,这时数据已经成功传输到客户端了。

JSONP 的缺点是:它只支持 GET 请求,而不支持 POST 请求等其他类型的 HTTP 请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值