zoukankan      html  css  js  c++  java
  • javaweb学习——会话技术(二)

    文中部分借鉴了:https://www.cnblogs.com/xdp-gacl/p/3855702.html

            https://blog.csdn.net/p744174529/article/details/71716097 

    session

    1.什么是session:

      session是一种将数据保存到服务端的技术,依赖Cookie技术。

    2.session的实现原理:

      当客户端访问服务器时,Servlet容器会创建一个Session对象和id属性,服务器创建Session后,会把session的Id以Cookie的形式返回给客户机,只要客户机的浏览器不关闭,再次访问服务器时,都会带着session的id值过来。

      服务端会为每一个客户端创建一个session对象,session对象就像是客户端在服务端的账号,它们被服务器放到一个Map集合中,这个Map集合被称为session缓存。当客户端后续访问服务端时,只要将session的id值传递给服务端,服务端就能判断出时哪一个客户端发送的,从而选择与之对应的session对象来为其服务。

    3.HttpSession API:

      HttpSession中的常用方法:

      String getId():用于返回当前HttpSession对象关联的Id值;

      long getCreationTime():用于返回当前HttpSession的创建时间。

      long getLastaccessedTime():返回客户端最后一次发送与session相关请求的时间。

      boolean isNew():判断当前session是否时新创建的。

      void invalidate():强制使当前的session对象失效。

      ServletContext getServletContext():用于返回当前session对象所属的ServletContext对象。

      void setAttribite(String name,Object value):将一个对象和一个名称关联后存储到session对象中。

      string getAttribite():用于从当前session对象中返回指定名称的属性对象。

      void removeAttribite(String name):用于从当前Httpsession对象中删除指定名称的属性。

    4.获取session:

      session与每个请求有关,为此HttpSessionRequest定义了两个获取session对象的getSession()方法:

        public HttpSession getSession(boolean create)

        public HttpSession getSession()

      request.getSession()有两种可能:一种使创建session,一种使获取session。

      第一个getSession方法使根据参数来判断当没有session对象时是否创建新的session对象,如果为true,就创建新的session对象。

      第二个getSession方法相当于第一个方法参数为true时,在相关的session对象不存在时创建新的session对象

      注意:由于getSession方法可能会返回会话标识号(id)的Cookie头字段,因此,必须在发送相应内容前调用getSession方法。

      session是由服务器端来创建的,当你访问服务器时,服务器不会立马给你创建一个session对象,而是在第一次访问session时,才给你创建,什么时候时第一次访问呢?既当你第一次调用getSession()方法时,服务器会先判断请求头中的Cookie.

    package cn.it.gan.sessionDemo;
    
    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("/SessionText")
    public class SessionText extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
       
        public SessionText() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            //使用request对象来获取session,如果session不存在就创建一个session;
            HttpSession session=request.getSession();
            //将数据存到session中
            session.setAttribute("date", "小小");
            //获取session的ID值
            String sessionID=session.getId();
            //判断此session是新建的还是已经存在的
            if(session.isNew()) {
                System.out.println("session对象已经创建好了,sessionID是"+sessionID);
            }else {
                System.out.println("session对象已经存在了");
            }
            
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }

    猜想request.getSession()方法内部新创建了Session之后一定是做了如下的处理

    复制代码
    1 //获取session的Id
    2 String sessionId = session.getId();
    3 //将session的Id存储到名字为JSESSIONID的cookie中
    4 Cookie cookie = new Cookie("JSESSIONID", sessionId);
    5 //设置cookie的有效路径
    6 cookie.setPath(request.getContextPath());
    7 response.addCookie(cookie);
    复制代码

     session注意事项:

      1.session的创建并不是在浏览器向服务器发出请求的瞬间产生的,而是在servlet端调用HttpServletRequest.getSession()时创建的。

      2.在一个jsp页面中,session能作为隐式对象被调用是因为jsp在编译的过程中自动调用了HttpServletRequest.getSession()。

      3.当在jsp页面中使用了<%@ page session="false"%>时,jsp页面不会去主动创建session,但是我们可以手动的去创建一个session。

    session的失效有两种情况:

      1.设置session的超时响应使它失效

      2.调用了session的invalidate()方法使它失效。

      需要注意的是,如果使用了第二种方法,session在失效的同时,浏览器会自动创建一个新的session。

      

      一般来说,要想使一个jsp中session为null,那么只有在jsp页面中使用<%@ page session="false"%>且不使用HttpServletRequest.getSession()或使用时设置为 HttpServletRequest.getSession(false)。

      同时需要注意的是当使用<%@ page session="false"%>,且在jsp代码中调用:

        <%

          HttpSession session = new request.getSession();

          out.print(session);

          session.invalidate();

          out.print(session);

        %>

      时,前后两个out.print()输出的是同一个session。

      但是如果不使用<%@ page session="false"%>,仅在jsp代码中使用

        <%

          out.print(session);

          session.invalidate();

          out.print(session);

        %>

      此时,输出的两个session不同。

  • 相关阅读:
    双向链表
    单链表实例+反转
    const,static,volatile
    html基础知识
    linux知识
    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) D. Delivery Delays (二分+最短路+DP)
    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) A. Altruistic Amphibians (DP)
    BZOJ 1453 (线段树+并查集)
    HDU 5634 (线段树)
    BZOJ 2124 (线段树 + hash)
  • 原文地址:https://www.cnblogs.com/zhilili/p/10864222.html
Copyright © 2011-2022 走看看