前几天在调试第三方支付接口时碰到一个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. 找出数组中最大值and索引

    找出数组中的最大值和和最大值的索引位置..... 第一中方法: /** * 找出数组中最大值和最大值的索引 * @param args */ public static void main(Strin ...

  2. find 查询文件,执行文件

    使用find查询文件批量处理文件: Find . -mtime +2 -name “*.log.*” -exec rm -f {} \; Find参数: Find : 查找 . : 当前目录 -mti ...

  3. spring深入学习(四)-----spring aop

    AOP概述 aop其实就是面向切面编程,举个例子,比如项目中有n个方法是对外提供http服务的,那么如果我需要对这些http服务进行响应时间的监控,按照传统的方式就是每个方法中添加相应的逻辑,但是这些 ...

  4. pycharm clion phpstorn全家桶激活码(可以用到2019年4月)

    SXXI7H41YN-eyJsaWNlbnNlSWQiOiJTWFhJN0g0MVlOIiwibGljZW5zZWVOYW1lIjoicGF5bmUgd2FuZyIsImFzc2lnbmVlTmFtZ ...

  5. ES6 generators in depth 一(译)

    今天在学习redux-saga时,外部链接推荐了这篇文章ES6 generators in depth,所以翻译的同时也可以加深一下对Generator的理解. 这里对原文一些只能在高版本现代浏览器使 ...

  6. 不同后台服务器共用同一session

    建一个类继承SessionStateStoreProviderBase类,override Initialize.SetAndReleaseItemExclusive.ReleaseItemExclu ...

  7. python计时器类

    import time as t class MyTimer(): def __init__(self): self.unit = ['年', '月', '日', '时', '分', '秒'] sel ...

  8. 26.HashCode

      在前面三篇博文中讲解了(HashMap.HashSet.HashTable),在其中不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分,所以 ...

  9. Self referencing loop detected for property 错误

    EF 序列化返回json时 报错:Self referencing loop detected for property 解决方案:在webapiconfig.cs文件中,增加设置: 1.config ...

  10. kafka中zookeeper的操作

    bin/zookeeper-shell.sh localhost:2181 <<< "get /brokers/ids/4" ./zkCli.sh -server ...