Session与Cookie

  • session概念:在WEB开发中,服务器可以每个用户浏览器创建一个会话对象session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。session对象以键值方式存储在ConcurrentHashMap中。
  • session与cookie区别?
  1. Cookie是把用户的数据写给用户的浏览器(数据存在本地浏览器)。
  2. Session是把用户的数据写到用户独占的session中(数据存在服务器内存)。
  3. Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象
  • 服务器是如何实现一个session为一个用户浏览器服务的?
服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,

这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带sessionid过来了,

就会使用内存中与之对应的session为之服务。

参考:https://www.cnblogs.com/xdp-gacl/p/3855702.html

 


  • 关于cookie
  1. cookie中包含信息:名字,值,过期时间,路径,域。
  2. cookie会带到http请求头中发送给服务器端。
  3. 如果cookie没有设置过期时间的话,那么cookie默认生命周期是浏览器的会话。
  • 浏览器查看cookie:

 


 

  • session机制
  1. session是容器对象,客户端在请求服务端的时候,服务端会根据客户端的请求判断是否包含了sessionid的标识。
  2. 如果已经包含了,说明客户端之前已经建立了会话。sessionid是唯一的值
  3. 如果sessionid不存在,那么服务端会为这个客户端生成一个sessionid。JSESSIONID
  • session对象的创建时机
  1. Session在用户第一次访问服务器的时候自动创建
  2. 需要注意只有访问JSPServlet等程序时才会创建Session,只访问HTMLIMAGE等静态资源并不会创建Session
  3. 如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。
  4. 可以用isNew()方法来判断Session是不是新创建的(其它相关方法自寻查询)。
  • session对象的销毁时机
    • session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间
<?xml version="1.0" encoding="UTF-8"?>
   <web-app version="2.5" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
   <!-- 设置Session的有效时间:以分钟为单位-->
   <session-config>
       <session-timeout>15</session-timeout>
   </session-config> 
 </web-app>
    • 当需要在程序中手动设置Session失效时,可以手工调用session.invalidate方法,摧毁session。

 

  • session共享问题
  1. 基于session复制(同步复制,tomcat之间session相互复制)(会造成浪费存储空间)
  2. 基于session统一存储(每一个session都会存储到一起,可以存数据库中也可以存到redis中)
  3. 基于cookie机制(App生成一个token通过http带到浏览器,每次请求带上token)
  • JWT的解决方案(基于cookie机制)

  1. Json Web Token:客户端和服务端信息安全传递以及身份认证的一种解决方案:用到登陆上
  2. Jwt的组成:jwt由3个部分组成:header,playload,signature
    • header
{
type:"jwt"   //类型
alg:"HS256"  //算法
}
    • playload
{

//jwt本身规范提供的格式claims

iss:""  //签发者

iat:""  //签发时间

exp:""  //过期时间

sub:""  //jwt拥有着(主题)

//自己定义一些claims

uid:""

}
    • signature  //header+playload组合成一个字符串
  • Base64(header).Base64(playload)组合的字符串根据算法密钥生成JWT的token。(str.签名字符串)

 

posted @ 2019-04-30 17:39  21karat  阅读(144)  评论(0编辑  收藏  举报