zoukankan      html  css  js  c++  java
  • 16_会话技术_Session

    【Session简述】

    * 在Web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下),因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

    【session和cookie的主要区别】

    * Cookie是把用户的数据写到用户的浏览器。

    * Session技术把用户的数据写到用户独占的session中。

    [ Cookie的局限 ]

      1.Cookie只能存字符串类型,不能保存对象

      2.不能存中文,数据类型只能为非中文String。

      3.1个cookie的容量不能超过4KB。

      4.相对数据存放不安全

    [ Session的特点 ]

      1.会话数据存放在服务器端(服务器内存),占用的是服务器资源。

      2.数据类型是任意的,没有大小的限制。

      3.相对安全。

    【获取session】

    Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

    【Session 使用核心技术】

    HttpSession类:用于保存会话数据。

    1.创建或得到HttpSession对象

      HttpSession request.getSession()

      HttpSession request.getSession(boolean create)

    2.设置session对象

      void setMaxInactiveInterval(int interval) :设置session的有效时间(单位:秒)

      void invalidate():手动销毁session对象

      String getId():得到session的编号Id

    3.保存会话数据得到Session对象

      void setAttribute(String name,Object value):保存数据

      Object getAttribute( String name ):获取数据

      void  removeAttribute(String name):清除数据

    【Session原理】

    1.服务器创建Session对象,分配一个唯一的标记(JSESSIONID),会话数据保存在Session对象中,然后服务器把JSESSIONID作为Cookie发送给浏览器保存。

      响应头:JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E

    2.浏览器得到JSESSIONID的cookie,保存在浏览器的目录中

    3.浏览器在下次访问服务器的时候,带着JSESSION的cookie数据访问服务器。

      请求头:Cookie:JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E

    4.服务器得到JSESSIONID,在服务器内存中查询是否存在对应的编号的Session对象。

    5.如果找到对应的Session对象,返回这个对象

    6.如果找不到对应的Session对象,有可能返回null,也有可能是创建新的session对象(HttpSession session=request.getSession(); )

    [核心的几个方法] 

      HttpSession session=request.getSession();

    1.创建Session对象

      Session session=new Session();

      Cookie cookie=new Cookie("JESSIONID","001");  //注意默认保存在浏览器内

      response.addCookie(cookie);

    2.得到Session对象

      在服务器查询对应的JESSIONID的对象,返回session对象。

    结论:浏览器通过JESSIONID(Session编号)在服务器中查询session对象

    【session的几个细节】

     1.setMaxInactiveInterval:设置Session对象的有效时间

      注意:并不是浏览器关闭,session就销毁!!

      默认情况:等待30分钟空闲时间,session对象才会销毁。

    设置全局的Session对象的过期时间(分钟),如下:

    <!--  设置全局的Session对象的过期时间(分钟) -->
    <session-config>
        <session-timeout> 1 </session-timeout>
    </session-config>

    2.可以让JSESSIONID不会随着浏览器关闭而丢失!!

    /**
    * 设置JESSIONID的时间,不会随着浏览器的关闭而丢失!
    */
    Cookie c=new Cookie("JESSIONID",session.getId());
    c.setMaxAge(1*30*24*60*60);   //1个月
    response.addCookie(c);

    3.直接手动销毁Session对象

    invalidate();

    4.创建或得到Session对象

    request.getSession(); / request.getSession(true);     //创建或得到session对象,查询session对象,如果没有对应的session对象,就创建新的session对象。
    request.getSession(false);  //得到Session对象。查询session对象,如果没有直接返回null

    【Session入门案例】

    [SessionDemo00.java]  存储一个Session对象

    package com.session.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    @WebServlet("/SessionDemo00")
    public class SessionDemo00 extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        public SessionDemo00() {
            super();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            HttpSession session=request.getSession();
            session.setAttribute("name", "哈哈哈哈");
            
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        }
    
    }

    [SessionDemo01.java] 查询对应的Session对象

    package com.session.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    @WebServlet("/SessionDemo01")
    public class SessionDemo01 extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        public SessionDemo01() {
            super();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out=response.getWriter();
            
            HttpSession session=request.getSession();
            String value=(String) session.getAttribute("name");
            //输出获取的Session数据到浏览器
            out.write("获得Session值是:"+value);
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        }
    
    }

    【运行结果】

    [ 1.第一次访问SessionDemo00 ]

    [ 2.然后访问SessionDemo01 ]

     [ 隐藏问题:关闭对应的火狐浏览器,重新访问SessionDemo01,会出现以下情况 ]

    【如何解决上面的而隐藏问题,我们希望所有浏览器所有页面后,访问ServletDemo01时仍能获取对应的Session】

    [ ServletDemo00.java ] 需要在ServletDemo00中代码修改

    package com.session.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    @WebServlet("/SessionDemo00")
    public class SessionDemo00 extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        public SessionDemo00() {
            super();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            HttpSession session=request.getSession();
        /*-------------------增加以下代码--------------------------*/ String sessionId
    =session.getId(); Cookie cookie=new Cookie("JSESSIONID",sessionId); cookie.setPath("/HelloServlet"); cookie.setMaxAge(10*60); //有效期10分钟 response.addCookie(cookie); session.setAttribute("name", "哈哈哈哈"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }

    [ 关闭浏览器所有页面后(首先访问过SessionDemo00),再次访问SessionDemo01后 ]

  • 相关阅读:
    选择学习Web前端开发的理由
    在Nginx下部署SSL证书并重定向至HTTPS
    使用pm2快速将项目部署到远程服务器
    DNS域名解析过程
    HTML5新特性总结
    基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块
    react中使用css的7种方式
    原生JS实现滑动轮播图
    H5与企业微信jssdk集成
    img图片不存在显示默认图
  • 原文地址:https://www.cnblogs.com/HigginCui/p/5991985.html
Copyright © 2011-2022 走看看