zoukankan      html  css  js  c++  java
  • session详解&和cookie的区别

    session简介

    1. 定义

    session用来保存会话数据, 将数据保存到服务器中.

    2. 作用

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

    3. 原理

    浏览器访问服务器后,服务器创建session出来,会把session的id号(JSESSIONID),以cookie的形式回写给客户机(这个cookie是普通的cookie,会在浏览器关闭的时候自动销毁,如果想要持久化使用这个session,需要手动设置cookie的过期时间),这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。

    4. 常用API

    方法作用
    HttpSession   request.getSession() 获取session对象(容器)
    session.setAttribute(String name, Object value) 存数据
    Object   session.getAttribute(String name) 取数据
    session.removeAttribute(String name) 删数据
    String   session.getId() session的唯一标识
    session.invalidate() 使session容器失效

    4. Session的生命周期

    那么session是在什么时候被创建的呢?

    1,访问jsp页面:

      大家都知道jsp页面有9大内置对象,其中就包括session,所以在jsp页面被第一次请求访问的那一刻,session就就被创建好了

    2,访问servlet:

      第一次调用session.getSession()的时候

     而又在什么时候被销毁的呢?

    1,调用session.invalidate()方法,通知服务器销毁session容器

    2,session默认超时时间是30分钟,如果30分钟没有对session做任何操作,自动销毁

    3,服务器类似于断电,也会销毁session

    5. Session和Cookie一般如何结合使用

    上一篇咱们也提到过cookie默认在浏览器关闭的时候被销毁,而session被销毁的时间一般要比cookie要长很多,

    所以cookie想要结合session一起持久使用的话 就需要手动设置JSESSIONID这个cookie的过期时间。

    如下:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 需求: 使用session容器保存数据
            // 1 获取session容器的引用
            HttpSession session = request.getSession();
            // 2 将用户的ip地址保存到session容器中
            session.setAttribute("ip", request.getRemoteAddr());
    
            // 4 问题: 浏览器关闭后, 访问取出数据的servlet 无法显示ip地址?
            // 原因: 服务器创建保存session唯一标识的cookie 在浏览器关闭时过期, 浏览器不传session的唯一标识, 服务器就无法找到对应的容器, 数据就拿不到
            // 解决: (手动)自定义cookie,设置最大生存时间,保存session的唯一标识, 这样就可以保证关闭浏览器不过期
            Cookie cookie = new Cookie("JSESSIONID", session.getId());
            cookie.setPath("/"); // 第一个"/" 代表 http://ip:端口号/
            cookie.setMaxAge(60 * 60 * 24);
            response.addCookie(cookie);
    
            // 3 给浏览器响应一句话
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().println("设置成功!");
        }

    6. 解决浏览器禁用cookie

    当浏览器将cookie禁用,基于cookie的session将不能正常工作,每次使用request.getSession() 都将创建一个新的session。达不到session共享数据的目的,但是我们知道原理,只需要将session id 传递给服务器session就可以正常工作的。

    解决方案:url重写

      response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。
      response.encodeURL(java.lang.String url) 用于对表单action和超链接的url地址进行重写

    这两个用法基本一致,只不过考虑特殊情况,要访问的链接可能会被Redirect到其他servlet去进行处理,这时候用encodeRedirectURL()方法就可以了

    如果浏览器禁用cooke,将自动追加session id ,如果没有禁用,将不进行任何修改。

    注意:如果浏览器禁用cookie,web项目的所有url都需进行重写;否则session将不能正常工作。

    cookie 和session 的区别:

    1,cookie数据存放在客户的浏览器上,session数据放在服务器上。

    2,cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

    3,session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

    4,单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

    5,可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

  • 相关阅读:
    0401. Binary Watch (E)
    0436. Find Right Interval (M)
    0151. Reverse Words in a String (M)
    1344. Angle Between Hands of a Clock (M)
    0435. Non-overlapping Intervals (M)
    0434. Number of Segments in a String (E)
    0063. Unique Paths II (M)
    0062. Unique Paths (M)
    0100. Same Tree (E)
    0190. Reverse Bits (E)
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/9235891.html
Copyright © 2011-2022 走看看