• 15. 会话之session


    会话之session

    session简介

    在WEB开发中,服务器可以为每个客户端浏览器创建一个session对象,默认情况下一个浏览器独占一个session对象。在实际应用当中,服务器程序可以把一些敏感数据写到用户浏览器独占的session中可以提高安全性,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

    session和cookie的主要区别是:

    • session存储在服务器端
    • cookie存储在客户端

    所以呢 直接就是 它存在服务器中 而且呢 session 它比较安全


    JavaEE中的session

    在javax.servlet.http包下有个HttpSession类,通过该类就可以操作session。
    获取Session对象的方式:通过调用request对象中的getSession()方法就可以获取Session对象了不需要手动new创建。

    Session中常用的方法:

      • public void setAttribute(String name, Object value)
        该方法用于向 Session 的中放入一个键值对。
      • public Object getAttribute(String name)
        该方法用于从 Session 中根据名字获取值。
      • public void removeAttribute(String name)
        该方法用于从Session中删除数据。

    所以直接一句话: 用javax.servlet.http包下的HttpSession类 就可以操作session  记住啊 是HttpSession类,获取用request.Session即可。

    例:

    package login;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class login extends HttpServlet {
        /*
         *      例:输入账号密码 然后将它存储到session中 然后返回给浏览器 显示出来即可
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");        //设置返回的指定编码
            
            String user = request.getParameter("user");
            String pass = request.getParameter("pass");
            
            //先用request中的方法新建一个HttpSession对象:
            HttpSession session = request.getSession();
            //然后往里面塞入账号和密码:
            session.setAttribute("name", user);
            session.setAttribute("pass", pass);
            
            //然后发回给服务器
            PrintWriter out = response.getWriter();
            out.print("您好:    " + session.getAttribute("name") + "<br>");
            out.print("您的密码是:" + session.getAttribute("pass") + "<br>");
            out.print("欢迎您!");
        }
    
    }

    不仅如此啊 你可以自己写一个servlet  直接访问获取到看看是不是啊。因为session存在服务器上 同一项目全部servlet都可以获取的到的啊。

    例:

    package time;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    
    public class index extends HttpServlet {
        
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            /*因为默认是GET方式 所以呢我们在这里获取一下另一个工程的name 和 password 【就是  例:输入账号密码 然后将它存储到session中 然后返回给浏览器 显示出来即可 这个例子↑↑↑】*/
            //先设置返回的编码:
            response.setContentType("text/html;charset=UTF-8");
            
            //然后获取 如果获取到了 即返回给浏览器打印 如果没就返回浏览器打印Null了:
            HttpSession session = request.getSession();
            String user = (String) session.getAttribute("name");
            String pass = (String) session.getAttribute("pass");
            
            PrintWriter out = response.getWriter();
            out.print("获取服务器【实际点是浏览器】中的session成功! <br>");
            out.print("name" + user + "<br>");
            out.print("pass" + pass + "<br>");
            
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        }
    
    }

    以上总结几点: 我尝试过同一项目 和 不同项目 的servlet 来获取session 结果如下:

    如果同一项目的:servlet 钧都可以获取的到

    不同项目的servlet 是获取不了的。

    其次 不同浏览器也是访问不了的 因为:

     Session机制会为每个浏览器分配了一个 Session。即一个浏览器一个 Session,不同的Session之间的数据不能共享。

    session工作原理
    服务器会为每个浏览器分配一个session,每个浏览器只能访问自己的session对象,可http协议是无状态的,那服务器是如何识别这些浏览器的呢?
    服务器对Session对象是以Map的形式进行管理的,每创建一个session对象,服务器都会向该Map中的 key放入一个32位长度的随机串,这个随机串称为JSessionID, 之后将该session对象的引用放入到map的value中。
    session放入到Map之后,服务器还会自动将”JSESSIONID”作为 name,32位长度的随机串作为value,放到cookie中并发送到客户端该cookie会默认放到浏览器的缓存中,只要浏览器不关闭就一直存在。
    当浏览器第二次向服务器发送请求时会携带该cookie,服务器接收到之后会根据JSessionID从Map中找到与之对应的session对象。

     这个原理懂得即可!


    Session的失效
    若某个Session 在指定的时间范围内一直未被访问,那么 Session 将超时,即将失效在 web.xml 中可以通过标签设置 Session 的超时时间单位为分钟默认 Session 的超时时间为 30 分钟。这个时间并不是从 Session 被生成开始计时的生命周期时长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的时长

    例: 

      

        <!-- 设置失效时间为1分钟 -->
     <session-config>
          <session-timeout>1</session-timeout>
     </session-config>

    也可以在servlet中调用session中的invalidate()方法使session失效:

    //使session失效
    session.invalidate();

    数据空间范围对比

    在 JavaWeb 编程的 API 中,存在三个可以存放数据的空间范围对象,这三个对象中所
    存储的数据作用范围,由大到小分别为:
    ServletContext—>HttpSession—>HttpServletRequest
    ServletContext,即application,置入其中的数据是整个web应用范围的,可以完成跨会话
    共享数据。
    HttpSession,置入其中的数据是会话范围的,可以完成跨请求共享数据。
    HttpServletRequest,置入其中的数据是请求范围的,可以完成跨 Servlet 共享数据。
    但这些 Servlet 必须在同一请求中。
    对于这三个域属性空间对象的使用原则是,在可以保证功能需求的前提下,优先使用小
    范围的。这样不仅可以节省服务器内存,还可以保证数据的安全性。

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14823658.html

  • 相关阅读:
    vc++ generate random via random_device and uniform_int_distribution
    Windows OpenGL 图像对比度调节
    OpenGL ES 版本介绍
    Windows OpenGL 图像伽马线
    Windows OpenGL 图像反色
    OpenGL ES 简介
    Windows OpenGL ES 图像饱和度调节
    修改 Docker 数据根目录
    mysql分库备份与分表备份
    docker dockerfile 映射端口范围 批量映射端口
  • 原文地址:https://www.cnblogs.com/bi-hu/p/14823658.html
Copyright © 2020-2023  润新知