zoukankan      html  css  js  c++  java
  • 对JSP中的Session 简单理解

    我的理解:

    简单来说,要使用服务器端的session对象,就是要有其对应的key,即sessionid,它只认识sessionid。
    下面我说的cookie,url重写或者隐藏表单,都是为了将其对应的key,即sessionid,一起与请求发送到服务器。

    另外,cookie与session都是用来标识用户的手段,cookie将用户的一些信息存储在客户端,而session是将用户信息保存在服务器端的,JSP的默认是保存在服务器端内存中(各种语言的不太一样),服务器重启便会都清空了,而且session对象自己也有有效时间,当然也可以将session持久化存储在服务器硬盘等地方。

    下面的使用cookie的情况只是借用了cookie的手段来更方便的使用seesion。

    当用户请求访问动态JSP页面时

    • 如果在请求头中有cookie信息(含有jsessionid),那么JSP容器便会查找是否有与其jsessionid匹配的session(默认存在于服务器内存中),如果没有则创建(前提是request.getsession(true),JSP默认为true)
    • 如果请求头中没有cookie信息,那么JSP容器发给浏览器响应时,会在响应头信息中含有set-cookie信息(比如:Set-Cookie: JSESSIONID=12B65264540AC4B023CDEF11C08F2B12; Path=/SignInTest/; HttpOnly),如果浏览器没有禁用cookie,则浏览器会保存此含有jseesionid值得cookie,cookie的保存位置按cookie得类型决定,如果cookie没有设置有效时间,则默认为 会话cookie(保存在浏览器进程内存中,关闭浏览器便会被清除),如果cookie设置了有效时间,则为 持续cookie(保存在浏览器自己规定的硬盘文件中,只要cookie在有效时间内,重新打开浏览器也不会清除)。
      注:cookie的有效时间并不和session的有效时间同步,他们两个匹配只靠cookie中保存的sessionid,如果是会话cookie,即便浏览器关闭后,服务器端的seesion也不一定会被释放内存,除非session的到了seesion的存在时间,或者被调用了其invalidate方法解绑,再或者服务器重启。同理,即便cookie还有效,服务器端的session也可能因为以上某种原因销毁,当浏览器再次使用此还有效的cookie请求时,便会重复上面我说的当浏览器有cookie,而服务器没有其对应的session对象时。
      注:Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了。

    另外,这种session的使用方法需要依赖cookie,如果浏览器被禁用了cookie就不可用了,即浏览器不会保存响应头信息中的set-cookie。
    一般的解决方法有:

    • 重写URL(所有含有请求链接的页面都必须为动态生成)
    • 隐藏表单(所有含有隐藏表单的页面都必须为动态生成)
    request.encodeURL(String url);
    

    注意:此方法会自动检测浏览器是否禁用cookie,如果没有禁用,则将url原封不动的输出,反之拼接jsessionid的值。

    response.encodeURL(string url);
    

    注意HttpServletRequest的两个方法,jsp既是默认为true,创建session。
    在这里插入图片描述

    Cookie持久化

    发现在JSP响应头信息中的cookie都没有设置有效时间,及默认为会话cookie(保存在浏览器进程内存中),所以我想给他设置有效时间,使其持久化,可以保存在硬盘,重启浏览器后已经有效。

    //Cookie持久化
    Cookie jsessionid=new Cookie("JSESSIONID",session.getId());
    jsessionid.setPath("/项目名称路径/");
    jsessionid.setMaxAge(900);//单位秒,如果要删除cookie,则设置该方法参数为0.
    
    response.addCookie(jsessionid);
    

    最好判断一下,不要每次都响应cookie信息。

    参考:
    https://www.runoob.com/jsp/jsp-session.html
    https://blog.csdn.net/weixin_42217767/article/details/92760353
    https://blog.csdn.net/u012554102/article/details/49454797
    https://blog.csdn.net/dlovejava/article/details/80863855
    https://www.cnblogs.com/ym77/p/11323742.html
    https://blog.csdn.net/dlovejava/article/details/80863855
    https://blog.csdn.net/hgx_suiyuesusu/article/details/77678365?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

    https://blog.csdn.net/u013210620/article/details/52318884

  • 相关阅读:
    ajax提交Form
    MySQL新建用户,授权,删除用户,修改密码总结
    php 数组操作类(整合 给意见)
    PHP基于数组的分页函数(核心函数array_slice())
    php生成table表格
    百度地图定位
    python-redis-订阅和发布
    宿主机-免密登录Docker容器
    docker-文件系统出错处理
    python-redis集合模式
  • 原文地址:https://www.cnblogs.com/tfxz/p/12621531.html
Copyright © 2011-2022 走看看