Cookie和Session

彻底了解Cookie和Session的区别(面试)_session和cookie的区别-CSDN博客

会话:从客户端开始访问访问服务器,最终到客户端关闭与服务器之间数据交互,在这个过程中,可能存在若干个请求与响应.这些操作称为一次完整的客户端与服务器之间的一次会话. 

web程序使用HTTP协议传输.而HTTP协议是无状态的协议,对于事务处理没有记忆能力.这样就导致对于事务后续的处理需要再传一次信息,会使每次传输的数据量增大. 使用会话技术可以解决该问题.

Cookie技术

  • 在第一次登录后服务器返回一些数据(Cookie)给浏览器然后保存在本地,当该用户再次发送请求时,就会自动把上次请求存储的Cookie数据自动携带给服务器,服务器通过浏览器携带的数据就知道当前用户是谁了.
  • Cookie存储的数据量优先,不同的浏览器有不同的存储大小.但是一般不超过4KB.所有Cookie只能存储小量的数据.

Cookie的操作

  // 创建Cookie
        Cookie cookie = new Cookie("username","zhangsan");
        // 通过response响应给客户端
        resp.addCookie(cookie);
        resp.getWriter().write("aaaaaaaaaaaaaaaaa");

Cookie的分类:

临时Cookie:它仅存在于浏览器会话期间,如果浏览器关闭了,Cookie消失.

持久Cookie:手动给Cookie设置过期时间,这样即使浏览器关闭了,Cookie仍然存在,除非过期时间到了,才会失效.

        // 创建Cookie
        Cookie cookie = new Cookie("username","zhangsan");
        // 设置过期时间 单位为秒
        cookie.setMaxAge(60*60*24);
        // 设置cookie的域名
        cookie.setDomain("localhost");
        // 设置cookie的路径
        cookie.setPath("/");
        // 通过response响应给客户端
        resp.addCookie(cookie);

获取Cookie

通过req.getCookies() 方法获取Cookie.

@WebServlet("/cookie1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("接收到请求......");
        // 获取cookie
        Cookie[] cookies = req.getCookies();
        if(cookies !=null ){
            // 遍历数组,找出自己的cookie
            for (Cookie cookie : cookies) {
                // 遍历出来的cookie之后,需要根据cookie的名称进行判断
                if("username".equals(cookie.getName())){
                    System.out.println("cookie的值为:" + cookie.getValue());
                }
            }
        }
    }
}

Cookie的不足

  1. 数量受到限制. 一个浏览器最多创建300个Cookie,并且每一个不能超过4KB,每一个Web站点能设置的Cookie总数不能超过20个.
  2. 安全性不能保障:  在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。
  3. 浏览器可以禁用Cookie

Session技术

        session也是会话技术,它是基于Web服务器的一个会话技术.数据存储在服务器内部.基于本次客户端开始访问服务器,一直到访问结束,服务器内部会创建针对当前这个客户端一个唯一的session对象,存储在这一个系列操作中的关键性数据.

session的生命周期

session产生时间

  • 当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。
  • 这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
  • 服务器同时也把sessionID和对应的用户信息、用户操作记录在服务器上,这些记录就是session。再次访问时会带入会发送cookie给服务器,其中就包含sessionID。
  • 服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里。

销毁时间:

客户端默认事件持续30分钟内,都没有与服务器有任何交互.这是session默认事件到,服务器会自动销毁.

  • 在Tomcat的管理页面上,可以配置某个项目的全局session过期时间
  • 在项目的核心配置文件web.xml中配置session的过期时间
<web-app>
  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>
</web-app>

通过session中的方法设置过期时间

session.setMaxInactiveInterval(120);

调用session的销毁方法:

//销毁session

session.invalidate();

不正常的关闭服务器,session随着Tomcat服务器的关闭会销毁.

正常关闭服务器.Tomcat会将当前内存中的所有session通过io对象(对象序列化技术) 存储在Tomcat的Work目录下,下次启动Tomcat的时候,会进行反序列化,然后将其加载回来.(session的活化和钝化) 

 获取session对象

调用getSession(boolean create)方法:

  • 如果传递的boolean值是true,session存在,直接返回session,session不存在会创建session并返回session.
  • 如果传递的boolean值为false,这时session不存在,返回null,session存储,直接返回session对象
@WebServlet("/session")
public class SessionDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // session是由服务器维护,而且session是由服务器创建,我们在程序中只能获取,无法创建
        /**
         * 在Servlet或者jsp文件中,调用getSession()方法:
         *  1、先根据客户端获取Session,如果服务器内部并没有基于这个客户端的Session对象
         *     这时服务器会针对这个客户端创建一个session对象,并返回
         *  2、如果在获取session的时候,基于这个客户端的session已经存在,这时只会返回这个session不会创建        
         */
        HttpSession session = req.getSession();
        System.out.println(session);

    }
}

session作为域对象

session作为一个容器,可以在客户端一系列的操作过程中存储一些共享的数据.

在任何的一个servlet或者jsp页面基于当前这个客户端获取的session中存储数据,在其他的servlet或者jsp中.可以直接回去数据.

  • setAttribute(String name,Object value):给session中存储数据.
  • getAttribute(String name):获取当前指定的name对应的值,如果不存在返回null
  • removeAttribute(String name):根据指定的name ,从session删除name和对应的value

JSESSIONID

        服务器识别客户端的session对象依赖的是:服务器在创建session对象的时候,给每个session绑定了一个唯一的jsessionid的字符串数据.

        在客户端访问到服务器之后,服务器内部创建出session,而且在服务器内部给客户端响应数据的时候,将jsessionid作为Cookie的数据一起发送给客户端.

 后续客户端访问的时候,会携带jsessionid,服务器通过jsessionid就可以找到当前这个客户端的session对象.

注:如果浏览器将cookie禁用了,导致每次访问服务器,即使session存在,服务器也无法找到对应的session对象。因为客户端请求的时候不会携带jsessionid。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值