前几天在调试第三方支付接口时碰到一个session失效问题,用了几天时间才搞明白,现在回想一下,主要还是由于cookie和session这一块的一些基本概念没有搞清楚,现总结一下。

  浏览器使用HTTP协议作为应用层协议,而HTTP协议是一个无状态协议,但是通常web站点希望能够识别用户,可能是因为服务器希望限制用户的访问,或者因为它希望把内容与用户身份联系起来。这就需要将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据及状态保存下来,通常有两种方案:cookie和session。

cookie

  服务器为了识别用户身份而临时存放在浏览器端的少量数据。浏览器器访问服务器时,服务器将一些数据以Cookie消息头的形式发送给浏览器(由程序指定),浏览器会将这些数据保存下来;当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。

使用Cookie

//添加Cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
//读取Cookie
Cookie[] request.getCookies();
String cookie.gtName()
String cookie.getValue()

Cookie编码问题

  cookie只能存放合法的ascii字符,如果要存放中文,可以将中文转换成合法的asscii字符形式,通过如下方式进行编解码,编码后的字符串可以存到cookie中,读取时再进行解码。

String URLEncoder.encode(String str,String charset); //编码
String URLDecoder.decode(String str,String charset); //解码

Cookie生存时间问题

可以通过cookie.setMaxAge(int seconds)来设置:
seconds>0,浏览器会将cookie保存在硬盘上,超过指定时间cookie失效;
seconds<0,默认值,浏览器会将cookie存在内存中,关闭浏览器后cookie失效;
seconds=0,删除cookie;

Cookie的路径问题  

  浏览器端保存的cookie内容主要包括:名字,值,过期时间,路径和域名。

  浏览器在访问服务器上的某个地址时,会比较Cookie的路径与该路径是否匹配,浏览器只会将路径匹配的Cookie发送给服务器。cookie的默认路径为添加该cookie的web组件的路径,比如/servlet/addCookie.jsp添加了一个cookie,则浏览器端保存该cookie对应的默认路径为:/servlet。

  在浏览器端一般会保存多个cookie,当浏览器要访问服务器时如何决定要将哪个cookie添加至消息头中呢?

匹配规则如下:
  要访问的地址必须是cookie的路径或其子路径,而且域名需一致。
  比如浏览器端保存的cookie的路径是/servlet/work/,当访问/servlet/buy.jsp这个页面时是不会将该cookie放入消息头中的,而当访问/servlet/work/buy.jsp或/servlet/work/flow/buy.jsp两者之一时,浏览器是会将前面的cookie放入消息头之中的。

cookie的限制

a.cookie不安全

b.cookie可以被用户禁止

c.cookie只能保存少量数据,4k左右

d.浏览器保存的cookie的数量也有限制(大约几百个)

e.cookie只能保存字符串

session(会话)

  服务器端为了保存状态而创建的一个特殊的对象。

  浏览器访问服务器时,服务器会创建一个特殊对象session(由程序指定,该对象有一个唯一的id,本文称之为sessionId),服务器会将sessionId以cookie形式发送给浏览器;当浏览器再次访问服务器时,会在消息头中带有包含sessionId的cookie消息头,服务器端可以利用这个sessionId找到相应的对象,来保存一些状态值。

使用session

//方式一HttpSession session = request.getSession(boolean flag);
//当flag为true时,先查看请求当中有没有sessionId,如果有,则依据该sessionId查找对应的session对象,找到则返回,找不到则创建新session对象;如果请求当中没有,则直接创捷session对象;//当flag为false,与true类似,只是在没有找到session对象时返回空

//方式二HttpSession session = request.getSession();   //等价于request.getSession()

session超时

  服务器会将空闲时间过长的session对象删除掉,这样做是为了节省内存空间的占用。服务器默认的超时时间一般是30分钟。可以通过setMaxInactiveInterval(int seconds)来设置两次请求之间的最大时间间隔,也可看成是失效时间,如果超过这个失效时间,则服务器会销毁这个session对象。

使用session场景

比如登陆控制,在登陆成功后,将一些数据绑定到session对象上,如:

session.setAttribute("user",user);

当用户请求要保护的资源(只有登陆成功才能访问的资源)时候,进行session验证:

Object obj = session.getAttribute("user");
if(obj == null){//没有登陆,重定向到登陆页面response.sendRedirect("login.jsp)";
}

注:以上关于session和cookie的demo是在tomcat容器下测试的

转载于:https://www.cnblogs.com/volcano-liu/p/9264996.html

cookie、session总结相关推荐

  1. 彻底理解cookie,session,localStorage(附代码)

    2019独角兽企业重金招聘Python工程师标准>>> 1. cookie 1.1 什么是cookie cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某 ...

  2. 2、cookie session token详解

    cookie session token详解 转自:http://www.cnblogs.com/moyand/ 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, ...

  3. 基于requests模块的cookie,session和线程池爬取

    基于requests模块的cookie,session和线程池爬取 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三"人人网"个人主页数据)时,如果使用之前req ...

  4. .net session 有效时间_Python中requests模拟登录的三种方式(携带cookie/session进行请求网站)...

    这篇文章主要介绍了python中requests模拟登录的三种方式(携带cookie/session进行请求网站),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋 ...

  5. C# 系统应用之Cookie\Session基础知识及php读取Cookie\Session

    本文主要是毕业设计"个人电脑使用记录清除软件"系列系统应用文章中关于Cookie方面的知识,主要从介绍Cookie的基础知识和PHP关于Cookie\Session两个会话管理机制 ...

  6. Cookie ,Session

    会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端态的状与数据的. 会话技术分为Cookie和Session: Cookie:数据存储在 ...

  7. 会话Cookie及session的关系(Cookie Session)

    会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...

  8. node --- [express] cookie/session 机制与 中间件的使用(路由守卫)

    说明 源代码 记忆.遗忘回顾 使用 cookie/session 机制,让 客户端/服务器 的访问变得有状态 cookie 与 session 由于 HTTP 协议的无状态性,当一次连接断开后. 服务 ...

  9. php cookie 字串,php入门(字符串,cookie,session)

    php入门(字符串,cookie,session),有需要的朋友可以参考下. 字符串 获取字符串的长度: strlen()函数 获取中文字长echo mb_strlen($str,"UTF8 ...

  10. cookie session token 之间的区别

    cookie 和session的区别 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 ...

最新文章

  1. 如何在JavaScript中切片和拼接数组
  2. VirtualBox中Ubuntu的全屏
  3. linux多进程server 进程池_Python 中的进程池与多进程
  4. VC++ 坐标问题总结,控件大小随窗口变化
  5. ubuntu安装 ftpd server(vsftpd)
  6. 【MATLAB统计分析与应用100例】案例014:matlab读取Excel数据,调用stepwise函数作交互式逐步回归分析
  7. python3.5和3.7可以共存吗_centos7下Python和python3共存
  8. “扎金花FANS”进行了改进
  9. 推荐两个在线格式化JavaScript代码的网站
  10. HXSafeGuard工程通过VS2010编译未安装VS2008出现以下错误
  11. Code Chef May Challenge 2019题解
  12. 解决Fragment重复加载问题
  13. linux/mac下一键删除下载失败的maven jar包
  14. 20年研发管理经验谈(十四)
  15. Mybatis+spring知识点
  16. 北京大学肖臻老师《区块链技术与应用》ETH笔记 - 8.0 ETH挖矿难度的调整
  17. PWM调光频率0.1-20KHz以内,共阳极控制高辉无频闪LED车灯调光电源驱动芯片方案FP7125/FP7122/FP7123
  18. day06数组-一维数组二维数组
  19. 基于Java开发一套完整的区块链系统(附源码)
  20. 使用 advanced installer 为 winform 做自动更新

热门文章

  1. 高考631能上什么好的计算机学校,2021年高考630分能上什么大学 可以报哪些学校...
  2. usaco Network of Schools
  3. python tornado教程_Tornado 简单入门教程(零)——准备工作
  4. 缓存成神路:Redis读写分离难以理解?一文解析Redis读写分离技术
  5. 常用python工具类代码总结
  6. Java 使用itextPdf7操作pdf,写入照片这一篇就够了
  7. 第一章:点云中的滤波问题---Filters
  8. 和12岁小同志搞创客开发:手撕代码,做一款遥控灯
  9. 基于caffe的度量学习实现(Siamese network Triplet network)
  10. CV算法复现(分类算法2/6):AlexNet(2012年 Hinton组)