Cookie,Session学习(java servlet编程)

时间:2022-01-12 21:01:01

Cookie

问题:HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?

为了解决这个问题,引入了Cookie技术;

Cookie技术其实就是浏览器端实现的数据临时存储技术,保存一些必要的数据,当访问某些网页需要这些数据时,浏览器自动将数据加到HTTP请求中;

但是具体要保存哪些数据,还有访问哪些网页加上Cookie,还有Cookie信息保存多久都是由服务器决定的。

浏览器的Cookie数据保存位置:

Cookie,Session学习(java servlet编程)

 

下面就介绍在java servlet编程中如何使用Cookie技术

如果不懂Servlet编程的要先了解servlet,先看另一篇文章:https://www.cnblogs.com/zdl2234/p/11280080.html

  创建Cookie对象
       Cookie c=new Cookie(String name, String value);//Cookie是作为键值对的形式保存的
  设置cookie(可选)
    设置有效期
      c.setMaxAge(int seconds);//如果不设置有效期,那么数据只会保存到浏览器内存中,浏览器关闭就会失效
    设置有效路径
      c.setPath(String uri);  //如果不设置有效路径,则访问任何网页都会附带这个Cookie数据
    响应Cookie信息给客户端
            resp.addCookie(c);

Cookie的获取

  获取Cookie信息数组
    Cookie[] cks=req.getCookies();
  /遍历数组获取Cookie信息
    使用for循环遍历即可,示例:
      if(cks!=null){
        for(Cookie c:cks){
          String name=c.getName();
          String value=c.getValue();
          System.out.println(name+":"+value);
        }
      }

 

Session

  学习 Cookie 之后,解决了不用用户编写请求数据的共享问题。但具体的数据还是由客户端发送过来的,其实某个Servlet需要的数据很可能是别的Servlet已经获取过的,我们可以通过别的Servelt获取需要的数据,就不用每次都要客户端发送了,减少了数据的量,可以提高数据的传输效率。

那么现在要解决的就是Servlet之间的数据共享问题,那么Session就出现了;

  原理:用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建 一个 session 对象,用来存储用户请求处理相关的公共数据,并将 此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中 (临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请 求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后, 调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其 对应的 session 对象

  与Cookie不同的是,Session的数据是保存在服务器上的,不同的Servlet通过同一个JSESSIONID就可以获取同一个Session;

如何使用Session?(一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。)
//创建session对象/获取session对象
  HttpSession hs=req.getSession();
  //如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session队形
  //如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存储到浏览器内存中
   //如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
//
设置session存储时间   hs.setMaxInactiveInterval(int seconds); //注意:   //在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时。
  //
设置session强制失效   hs.invalidate(); //存储和获取数据 //存储:
  hs.setAttribute(String name,Object value);
//获取:
  hs.getAttribute(String name) 返回的数据类型为Object
//注意: //存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。

Session失效处理:
  因为Session都有一个存储时间,当访问别的需要用到Session的网页,通过HttpSession hs=req.getSession()获取Session,再通过Session获取之前存的信息;

  这时候有两种情况:

  1,可以获取之前的信息,这表示Session没有失效,则继续处理;

  2,获取信息为null,这表示Session为新创建的,之前的Session失效了,一般这时候就要重定向到可以获取信息的页面了;