session

Posted 優syousetu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了session相关的知识,希望对你有一定的参考价值。

session技术

  4.1 引入

    cookie的局限:

      1.cookie只能存字符串类型,不呢个保存对象

      2.只能存非中文

      3.一个cookie的容量不能超过4kb

    如果要保存非字符串,超过4kb的技术,只能使用session技术

    session特点:

      会话数据保存在服务器端(内存中)

  4.2 session技术的核心

    HttpSession类:用于保存会话数据

    1.创建或者得到session对象

      HttpSession getSession();

      Httpsession getSession(boolean create)

    2.设置session对象

      setMaxInactiveInterval(int interval):设置session的有效时间

      invalidate():销毁session对象

      getId():得到session的编号

    3.保存会话数据到session对象中

      setAttribute():保存数据(域对象有的方法)

      getAttribute():  获取数据

      removeAttribute():  清除数据

  4.3 session原理

    问题:服务器可以识别不同的浏览者

    现象:

      浏览器1:1.创建session对象,保存会话数据

    

 1 package com.java.session;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpSession;
 9 /**
10  * 保存数据到session域对象
11  * @author syousetu
12  *
13  */
14 public class SessionDemo extends HttpServlet {
15 
16     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
17         //1.创建session对象
18         HttpSession session = request.getSession();
19         //2.保存数据
20         session.setAttribute("name", "rose");
21     
22         response.sendRedirect(request.getContextPath()+"/SessionDemo2");
23     }
24 
25 
26 }

    浏览器1:2.得到session中的对象

    

 1 package com.java.session;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import javax.servlet.http.HttpSession;
10 
11 /**
12  * 从session域对象中取出数据
13  * 
14  * @author syousetu
15  *
16  */
17 public class SessionDemo2 extends HttpServlet {
18     protected void doGet(HttpServletRequest request, HttpServletResponse response)
19             throws ServletException, IOException {
20 
21         // 1.得到session对象
22         HttpSession session = request.getSession();
23         String value = (String) session.getAttribute("name");
24         System.out.println(value);
25         
26     }
27 
28 }

    新的浏览器1:

      2.得到session中的数据:

        拿不到数据

    新的浏览器2:

      2.得到session中的数据

         拿不到数据

  取到数据的前提:在哪个域对象保存数据,就必须从哪个域对象取出

  得到了一个session,就给session分配了一个标记

请求头和响应头中所带的信息

代码解读:HttpSession session  = request.getSession();

  1.创建一个session对象,给session对象分配一个唯一的id,叫JSESSIONID

    new HttpSession()

  2.将ISESSIONID作为cookie的值发送给浏览器保存

    Cookie cookie = new Cookie("JSESSIONID",sessionID)

    response.addCookie(cookie)

  3.第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器

  4.服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象

    if((map.get(sessionID))){

      return map.get(sessionID)

    }

  5.如果找到对应编号的session对象,直接返回该对象

  6.如果找不到对应编号的session对象,创建新的session对象,继续走1的流程

 结论:通过JSESSION的cookie值在服务器找session对象

 4.4:session细节

  1. getID():得到session的编号

  2. 两个getsession的方法

    getSession(true)/getSession():创建或得到session对象。没有匹配的session编号,自动创建新的session对象

    getsession(false):只是得到session对象,如果没有匹配的,直接返回null

  3. setMaxinactiveInterva(int interval):设置session的有效时间  秒数

    (关闭浏览器,session还在)

    session对象销毁时间:

      1.默认情况下:30分钟服务器自动回收

      2.可以在web.xml中修改session的全局有效时间,按分钟计算,最小1分钟

        <session-config>

          <session-timeout>1</session-timeout>

        </sesison-config>

      3.修改session回收时间

      4.手动销毁session对象

        invalidate()  :手动销毁session对象

      (关掉浏览器后拿不到session,是因为session还在,但是浏览器中的标记没了,证明标记session的cookie是存放在浏览器内存中的 如想关掉浏览器仍然可以拿到session,则需要修改session的MaxAge,设为正数,保存在硬盘中)

总结:

  1.会话管理:浏览器和服务器会话过程中产生的会话数据的管理

  2.Cookie技术:

    new Cookie("name","value")

     response.addCookie(cookie)

    request.getCookies();

   3.Session技术

    request.getSession()

    setAttribute("name",会话数据)

    getAttribute("会话数据")

 

以上是关于session的主要内容,如果未能解决你的问题,请参考以下文章

一个队asp.net session进行了再次封装的C#类的代码

redis存储session配制方法

少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案

sqlserver-处理死锁

暑假自学JAVA Web心得

hibernate在使用getCurrentSession时提示no session found for current thread