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后 ]

  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/HigginCui/p/5991985.html
Copyright © 2011-2022 走看看