前几天在调试第三方支付接口时碰到一个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容器下测试的

cookie、session总结的更多相关文章

  1. cookie,session,sessionid

    cookie,session,sessionid http协议是无状态的,意思是每次请求的状态不会保存.因此,产生了cookie,session之类保存会话状态的机制.1.什么是cookiecooki ...

  2. Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

    servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...

  3. 在IE浏览器中iframe跨域访问cookie/session丢失的解决办法

    单点登录需要在需要进入的子系统B中添加一个类,用于接收A系统传过来的参数: @Action(value = "outerLogin", results = { @Result(na ...

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

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

  5. cookie,session,token的定义及区别

    参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...

  6. Java web学习 Cookie&&Session

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

  7. Cookie&Session(会话技术)

    一.Cookie技术 从打开一个游览器访问某个站点,到关闭这个游览器的整个过程成为一次会话 会话技术分为Cookie和Session Cookie:数据存储在客服端本地,减少对服务端的存储的压力,安全 ...

  8. Cookie Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  9. python Cookie Session 相关用法

    Cookie一.前言1.http协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响 应情况直接影响,也不会直接影响后面的请 ...

  10. django - 总结 - cookie|session

    Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...

随机推荐

  1. centos7制作本地yum源

    创建想要挂载的路径 mkdir /mnt/cdrom 挂载本地镜像到创建的目录 mount -t iso9660 /dev/cdrom /mnt/cdrom/ mount: /dev/sr0 is w ...

  2. 如何安装ubuntu系统

    https://www.cnblogs.com/Chinasf/archive/2010/05/06/1728840.html    [Ubuntu 下挂ISO到虚拟光驱的方法] 各种方法参考如下论坛 ...

  3. <笔记>字体文件的路径问题

    如果做过虚拟域名,不可以通过127.0.0.1来访问字体文件 改成通过虚拟域名访问,就没问题: 不过更建议使用相对路径

  4. [已解决]Cannot find one or more components.Please reinstall the application

    Microsoft SQL Server Management Studio 17,一段时间未用出现Cannot find one or more components.Please reinstal ...

  5. tensorflow安装过程cpu版-(windows10环境下)---亲试可行方案

    tensorflow安装过程cpu版-(windows10环境下)---亲试可行方案   一, 前言:本次安装tensorflow是基于Python的,安装Python的过程不做说明 二, 安装环境: ...

  6. SSAS 后端数据库访问模块中存在错误。 为绑定指定的大小太小,导致一个或多个列值被截断。

    在处理AS的过程中报错如上,经排查发现原因为数据库 “工号” 字段长度过长导致. 因为我的字段内容基本是人名加工号:张三/1001 不曾想有用户录入非正常数据 :张三/100/1001 这样导致我截取 ...

  7. docker 1 (ubuntu docker install)

    1.移除旧内核模块 sudo apt-get remove docker \ docker-engine \ docker.io 2. 添加https传输包 sudo apt-get update s ...

  8. Android插件化的兼容性(上):Android O的适配

    首先声明,<Android插件化开发指南>这本书所介绍的Android底层是基于Android6.0(API level 23)的,而本书介绍的各种插件化解决方案,以及配套的70多个例子, ...

  9. 工具安装(mac)

    1. iterm 2. nvm 3. node 4. git 5. VScode 6. postman 1.安装iterm2安装路径 https://www.iterm2.com/使用技巧https: ...

  10. IM群聊消息究竟是存1份(即扩散读)还是存多份(即扩散写)?

    1.前言 IM的群聊消息,究竟存1份(即扩散读方式)还是存多份(即扩散写方式)? 上一篇文章<IM群聊消息的已读回执功能该怎么实现?>是说,“很容易想到,是存一份”,被网友们骂了,大家争论 ...