session和cookie

一:Session

1.Session作用于服务器端,在客户端第一次请求服务器并调用request.getSession()时候创建,存放于内存,每个用户都有一个Session。(需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session)

2.Session生成后,用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。为防止内存溢出,服务器会把长时间内没有活跃即超时的Session从内存删除。

3.Session的尽量只存放一些重要的数据,减小内存占用,防止并发访问内存溢出。

4.Session统计同时在线人数,通过创建实现HttpSessionListener接口的监听器,每次创建Session次数+1,每次销毁-1;

5.服务器会为每个Session创建一个唯一的ID,这个SessionId在客户端与服务端会话是十分重要;

二:Cookie

1.Cookie属于浏览器管理,具有不可跨域名性。由于HTTP协议是无状态且是不安全的,所以Cookie的值常加密后保存。

2.一个用户的所有请求操作都应该属于同一个会话,不同的用户拥有不同的会话,而http请求是无状态的,那服务器怎么将这么多请求划分到具体用户的会话中呢?服务器在创建Session后会生成session的id并发送给客户端,客户端即浏览器会将这个id保存在cookie 容器中,根据保存的id可将无状态的请求归到同一个会话中。

3.Cookie的基本用法:

Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE);           // 设置生命周期为MAX_VALUE
cookie.setPath("/keepft/");                              // 设置路径
cookie.setDomain(".keepft.com");          // 设置域名
response.addCookie(cookie);                          // 输出到客户端

cookie.setMaxAge(maxAge):maxAge(秒)为正数时表示该Cookie会在maxAge秒之后自动失效,浏览器会将该Cookie写到本地文件中,即使浏览器关闭,在maxAge秒之前再打开浏览器该Cookie仍可用
  maxAge为-1时表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。(例如窗口打开的<iframe></iframe>子窗口)
  maxAge为0时表示删除该Cookie(Cookie用此方法删除Cookie,需要new一个Name一样新Cookie,并将Value设置为“”;修改一个cookie类似)
cookie.setPath(path):path设置为“/”时允许所有路径使用Cookie。path属性需要使用符号“/”结尾。
cookie.setDomain(domian):domain参数必须以点(".")开始。另外,name相同但domain不同的两个Cookie是两个不同的Cookie。(Cookie是不可跨域名的)

三:跨域名单点登录的应用

1.使用cookie同步session

  首先存在一个用户认证接口,若存在有效cookie则放行,否则返回登陆界面。所有站点其中一个网站登录登陆后会返回一个身份标识的cookie,之后向所有站点发送登陆请求并返回相同身份标识的cookie,然后浏览器保存了各个网站域名下认证的cookie,用户再从另一个网站访问浏览器会携带认证cookie请求后台,从而通过认证。(缺点:安全性不高、cookie存储容量有限、若浏览器禁用cookie则无法同步)

2.使用memcache缓存同步session

  单点登录后将产生的session存放在共享内存中并返回一个身份标识的cookie,同时向所有站点发送登陆请求并返回相同身份标识的cookie,此时浏览器会保存各个网站域名的认证cookie(相同的JSESSIONID),待其他网站发送请求会附带认证cookie,服务器会根据cookie的值从memcache中获取session,若存在则认证成功,否则认证失败,重新登陆。若浏览器禁用cookie或在手机浏览器上则可以将cookie的值放在请求的url上,后台获取url参数并根据它从共享区获取session同样实现用户认证

原文地址:https://www.cnblogs.com/hfblogs/p/7241457.html