• 工作中的技术总结_JAVA_AA-00001 关于Session的使用 _20210825


    AA-00001 关于Session的使用 _20210825

    Session Java 中的Session:javax.servlet.http.HttpSession;

    应用:

    在我自己的项目中 通过 页面传回的 HttpServletRequest参数实现 获取Session

    javax.servlet.http.HttpServletRequest;
    HttpServletRequest request
    
    HttpSession session = request.getSession(true);
    

    我们可以调用request的getsession()方法来使用session,通过setAttribute()注入值:

    session.setAttribute("patternFileInfoForm", patternFileInfoForm);
    

    之后可以用getAttribute()方法来获取session中的值:

    session.getAttribute("patternFileInfoForm")
    

    若要移除Session中特定的值,可以调用removeAttribute方法,但request中的SessionID仍不变,只是其中的值发生了改变,Session还是原来的Session。

    request.getSession().removeAttribute("xxx");
    session.removeAttribute(Constant.SESSION_PATTERNFILEMASTER_PATTERNFILEINFOFORM);
    

    相关知识:

    Session是用于存放用户与web服务器之间的会话,即服务器为客户端开辟的存储空间。
    由于客户端与服务器之间的会话是无状态的机制,Session则可用于关联访问,因此多用于用户登录等功能上。

    二、Session的意义何在?
    Session存在的意义是为了提高安全性,它将关键数据存在服务器端。与cookie不同,cookie则是将数据存在客户端的浏览器中。

    因此cookie是较为危险的,若客户端遭遇黑客攻击,信息容易被窃取,数据也可能被篡改,而运用Session可以有效避免这种情况的发生。

    三、Session的生命周期
    Session存储在服务器的内存中(为了高速存取)。

    Session何时生效
    Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

    Session何时失效
    1.服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。
    2.调用Session的invalidate方法。

    HttpSession session = request.getSession();
    session.invalidate();//注销该request的所有session
    

    3.session的过期时间是从什么时候开始计算的?是从一登录就开始计算还是说从停止活动开始计算?
    答:从session不活动的时候开始计算,如果session一直活动,session就总不会过期。
    从该Session未被访问,开始计时; 一旦Session被访问,计时清0;

    a)web.xml中

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    

    b)在程序中手动设置

    session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期
    request.getSession().setMaxInactiveInterval(-1);//永不过期

    c)tomcat也可以修改session过期时间,在server.xml中定义context时采用如下定义:

    <Context path="/livsorder" 
             docBase="/home/httpd/html/livsorder"   
             defaultSessionTimeOut="3600" 
             isWARExpanded="true"
             isWARValidated="false" 
             isInvokerEnabled="true"   
             isWorkDirPersistent="false"/>
    

    4.设置session的失效时间

    request.getSession().removeAttribute("xxx");
    

    四、Session的工作原理
    虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

    该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

    注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择”在新窗口中打开”时,子窗口便可以访问父窗口的Session。

    如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

    URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。

    注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。

  • 相关阅读:
    datetime和time的时间戳用法
    ER图
    python update()
    理解JWT(JSON Web Token)认证及python实践
    python lambda匿名函数 用法
    flask_restful(转载)
    Flask-SQLALchemy
    创建只有一个元素的元组
    MySQL安装过程中显示无法启动
    聚类
  • 原文地址:https://www.cnblogs.com/OwlInTheOaktree/p/15183366.html
Copyright © 2020-2023  润新知