了解cookie & session

  Web应用程序使用http协议,而这个协议是没有状态的协议。当服务器一旦响应客户的请求之后,就会断开 连接,而同一个客户的下一次请求将重新建立网络连接。服务器应用程序有的时候是需要 判断出请求是否是同一个客户发出的,比如 当购买端口时,有必要跟踪同一个客户发出的一系列请求。

  当客户端 (浏览器)和服务器之间交互了多次,那么 就需要将交互所涉及的数据即状态保存下来。而这个状态就是数据。管理指的是多次交互时对数据的修改。

  那么 状态管理就有两种模式。即客户端状态管理技术cookie,它负责将状态保存在客户端,即本地。还有一种猜也猜得出,自然是服务器状态管理技术session,它将状态保存在服务器端 。

  上面讲得是比较专业,那么通俗一些讲,比较你登录某种教育平台或其他网站,经常会看到“你好,账号XXXXXX”,这种形式。因为这种数据会经常在你切换不同的页面的时出现。还有,当你登录QQ号的时候,你先删除原先的账号,再输入两个你原来账号的开头数字,那接下来它会自动跳出来你的账号。这种数据就是用cookie存放,它是存放在本地浏览器上。所以是比较不安全的,涉及到一些安全问题,密码个人隐私 机密等等,那就用session了,它可以安安全全地放在服务器上。

  再深入一点,cooKie是存放在浏览器上,虽然不安全,但是与服务器无关。而session存放在服务器上,当数据量过大,访问量造成一定的压力,但是它安全。

关于cookie的编码方式。

  • cookie 只能保存合法的ASCII字符,如果要保存中文,需要 - - - 将中文转换成合法的ASCII字符,即编码 Cookie c = new Cookie("city",URLEncoder.encode("北京","utf-8"));
  • cookie生存时间 setMaxAge(n)
  • 保存中文 存数据时使用URLEncoder对中文转码
  • 取数据时使用URLDecoder对中文解码
  • 有效路径 setPath("")

session常用语句

  • 销毁数据 session.invalidate();
  • 设置数据 session.setAttribute();
  • 取数据 session.getAttribute();
  • 删数据 session.removeAttribute();

session 超时

  • 比如我登录了淘宝,一登录 就会被创建到一个session,如果用了然后空闲三十分钟
  • 那么 这个session将会被销毁。 当然可以修改配置文件设置这个时间
  • <session-config>
  • <session-timeout> 30 </session-timeout>
  • </session-config>
  • 缺省的时间通过编程来实现: void session :setMaxInactiveInterval(int seconds)

浏览器禁用了cookie session就不能用了

  • 但是可以URL重写的方式来使用 但是仍较烦。当然最好不要禁cookie。
  • 例如google浏览器设置里就有cookie禁用选项

session优缺点

  • 优点: 安全(将状态保存在服务端),能够保存的数据类型更丰富,而cookie只能保存字串 - session能保存更多的数据,cookie大约保存4k
  • 缺点
  • session将状态保存在服务端 ,占用了服务器的内存,如果用户量过大,会影响服务器的性能