天天看点

JavaWeb会话机制Cookie和Session什么是会话机制常用会话跟踪技术

JavaWeb会话机制Cookie和Session

  • 什么是会话机制
  • 常用会话跟踪技术
    • Cookie
      • 工作流程
      • 操作
      • 有效期
      • Cookie路径
      • 特点
      • 应用
    • Session
      • 原理
      • 操作
      • 有效期
      • SESSIONID的URL重写
      • 应用

什么是会话机制

用来跟踪用户的整个会话

  • 一次会话

    指浏览器给服务器发送请求访问web程序,该次会话就已接通,其中不管浏览器发送多少请求都视为一次会话,直到浏览器关闭,本次会话结束

常用会话跟踪技术

  • Cookie通过在客户端记录信息确定用户身份
  • Session通过在服务端记录信息确定用户身份

Cookie

工作流程

  1. 客户端发送请求到服务器
  2. 服务器servlet创建cookie,保存少量数据,发送响应到客户端,其中包括Set-Cookie头部
  3. 浏览器获得服务器发送的cookie数据并自动保存到浏览器端
  4. 浏览器再次访问时,发送包含Cookie头部的请求,自动携带cookie数据

操作

  • 创建

    由服务器创建:

    Cookie cookie = new Cookie(key,value);

    一旦cookie创建好了,就不能在往其中增加别的键值对,但是可以修改其中的内容:

    cookie.setValue();

  • 发送到浏览器

    addCookie(Cookie);

  • servlet接收cookie

    接收到浏览器发送的所有cookie:

    getCookies();

有效期

  • 默认:关闭浏览器cookie失效
  • 手动设置:

    cookie.setMaxAge(expiry);

    参数expiry:
    • 等于-1(默认):浏览器关闭后即会话结束后,cookie失效
    • 大于0:浏览器关闭后cookie不会失效,并保存在硬盘中,直到设置时间过期才会被浏览器自动删除
    • 等于0:删除cookie

Cookie路径

可以设置服务器端获取cookie的访问路径,并非服务器端web项目中所有的servlet都能访问该cookie

  • 默认路径:当前访问的servlet父路径
  • 修改cookie的访问路径:

    setPath("/test01/"); // 在test01项目下任何位置都能获取到cookie

特点

  • 一个web站点(项目)最多发送20个cookie
  • 一个浏览器最多保存300个cookie
  • cookie不安全,可能泄露用户信息。浏览器支持禁用cookie

应用

  • 记住用户名
  • 历史记录

Session

在服务器端来保持状态,用于共享数据技术

原理

浏览器请求服务器访问web站点时,服务器会先检查这个客户端请求是否包含SESSIONID:

  • 如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用
  • 如果不包含,则服务器为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值是一个不重复又不容易被找到规律以仿造的字符串,session id将在本次响应中返回到客户端保存,客户端可以用cookie保存,之后浏览器可以自动的按照规则把这个标识发回给服务器

Servlet容器负责创建HttpSession对象

操作

  • session的获取
    • request.getSession()

      如果没有将创建一个新的,等效getSession(true);

    • request.getSession(boolean)

      true:没有将创建;false:没有将返回null

  • 信息的存储和获取
    • 存储:

      setAttrubute(key,value);

    • 获取:

      getAttribute(key);

有效期

  • 销毁

    session不会随着浏览器的关闭而死亡,而是等待超时时间,默认超时时间为30分钟

    • session.invalidate()

      立即销毁session对象
    • 超过默认有效时间30分钟
    • 超过有效期设置时间
    • 服务器非正常关闭(如果服务器正常关闭,session就会被持久化(写入到文件中,等默认超时时间30分钟过后,就会被删除)
  • 有效期设置
    • setMaxInactiveInterval(int interval)

      设置有效时间,单位秒
    • 在web.xml中配置session的有效时间,单位:分钟
      <session-config>
          <session-timeout>30</session-timeout>   
       <session-config> 
       // 若值为负数或0则为不限制session失效时间
                 
      有效期过后HttpSessionListener中的

      sessionDestroyed()

      方法将被调用,销毁Session会话

SESSIONID的URL重写

  • 问题

    当浏览器将cookie禁用时用cookie保存的session不能正常工作,每次使用request.getSession()都将创建一个新的session,达不到session共享数据的目的

  • 解决

    通过URL将session id传递给服务器,即URL重写

    • 手动设置:

      url;jsessionid=....

    • API方式
      • 所有URL重写:

        encodeURL(java.lang.String url)

      • 重定向URL重写:

        encodeRedirectURL(java.lang.String url)

应用

  • 当前用户的登录状态
  • 发送给浏览器的验证码信息,且需要在服务器端进行验证
参考:https://www.cnblogs.com/whgk/p/6422391.html

继续阅读