zoukankan      html  css  js  c++  java
  • Session与Cookie(1)

    Session
    session是一种位于服务端,用于存储一个会话(指打开浏览器访问某个域名,及其下面的资源,然后关掉浏览器的过程)中所需的配置信息。也就是在一个会话中,只存在一个session。对于Java web编程来说,session就是在request.getSession()创建的。同样,session也可以通过setMaxInactiveInterval()设置其生存时间。
    
    session的结构类似一个map。可以根据需求put不同的key和value进去。通常,用作登录状态的保持,对应在客户端存储cookie,可以减少多次登录困扰。
    
    用Java代码体验下这一过程:
    
    PrintWriter writer = response.getWriter();
    
    HttpSession session = request.getSession();// 设置session有效时间为1天
    session.setMaxInactiveInterval(60 * 60 * 24);
    
    if (session.isNew()) {
        session.setAttribute("name", "cjt");
        writer.write("新建Session成功");
    
    }else {   
    
          writer.write(session.getAttribute("name").toString());
    
    }
    
    每个会话第一次与服务端产生交互,请求头Request Header是不包含任何cookie的,所以跟踪不到session,isNew()返回true;然后在同一次回话中,接下来的访问都返回false.
    
    
    
    对于tomcat容器来讲,getSession()默认会生成一个id为JSESSIONID的session,然后set-cookie保存到客户端(会话cookie),但是session默认生命周期是20分钟,所以第二次会话时上次的名为JESSIONID的cookie会丢失,但是session还存在服务器端,
    
    Cookie
    
    cookie是指为了辨别身份、进行 session 跟踪而储存在本地终端上的数据(通常经过加密),也可以叫做浏览器缓存。cookie是由服务端发出set-cookie指令,客户端根据设置的cookie信息创建本地cookie。
    
    一个cookie可看做一个实体类,里面存有当前cookie的key、value、maxage、path等。在访问path路径及其子路径时,会封装一系列相关的cookie集合到Request Header中,发送到服务器。
    
    具体java代码就是在服务端完成,记住创建了cookie对象后要添加到response中:
    
    PrintWriter writer = response.getWriter();
    
    HttpSession session = request.getSession();
    
    // 设置session有效时间为1天
    session.setMaxInactiveInterval(60 * 60 * 24);
    
    if (session.isNew()) {
        session.setAttribute("name", "cjt");
        writer.write("新建Session成功");
    
    } else {
        writer.write(session.getAttribute("name").toString());
    
    }
    
    
    
    特别注意
    
    在实际开发中,可能需要我们手动更改cookies的内容,那么cookie并不提供update,只有add方法。这里就要采取覆盖的方式更新了。
    
    举个例子,你把购物车的信息都在cookie key为cart的本地常驻cookie中,然后添加了商品到购物车,这里就要更新该cookie。重点就在这里,java里面获取到key为cart的cookie,你会发现只能取到里面的key和value,path和maxage都获取不到,具体原因我也不清楚。
    
    如果此时强行采取添加覆盖的方式,就会增加了一个会话cookie到客户端。而之前的常驻购物车cookie并没有改变。所以得每次手动设置path和maxage为了和之前保持一致,这样才能达到更新的目的。
    

      

  • 相关阅读:
    flutter 计算时间日期 在当年的第几周
    Flutter Future 异步 FutureBuilder 获取数据后 加载Widget
    macOS server 中描述文件管理器开启提示“发生错误,代码为-1”
    VS Code 添加chrome调试及localhost 拒绝连接请求问题
    Finished with error: Error running pod install (Android Studio 运行flutter项目)
    flutter moudle 项目编译生成 .ios 和 .android 更改.xx项目代码不被覆盖 flutter make-host-app-editable
    flutter项目 通道Channel封装及使用案例
    react-native 调用 TouchableOpacity (触摸透明) 时报了一个警告
    webstorm2016.2 for mac 安装
    Computed read-only property vs function in Swift
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6482480.html
Copyright © 2011-2022 走看看