Session与Cookie

发布时间:2024年01月12日

目录

一、Session会话技术

概念

常用方法

生命周期

有效期

场景

二、Cookie技术


一、Session会话技术

概念

浏览器和服务器之间为了实现某个功能,产生了多次请求和响应,从第一次请求开始到最后一次请求结束,这期间所有的请求和响应加起来称之为一次会话。会话要解决的最重要的问题是:如何存储产生的数据

  1. Session是javaweb提供的解决会话数据存储相关的技术
  2. Session是服务器端技术,将会话产生的数据存储在服务器端。这种技术的优点是比较安全,(相比于Cookie存储在客户端的方式要安全的多);缺点是如果存储的数据量较大的话,容易出现服务器端爆满。
  3. Session技术在服务器端为每一个客户端创建各自的session对象,用来存储该客户端会话产生的数据.
  4. 每一个客户端都使用各自对应的sessionm对象,不会造成混乱

常用方法

会话(Session)是一种在客户端和服务器之间存储和传递数据的机制。在Java中,可以使用HttpSession接口提供的方法来管理会话。

HTTPSession session = request.getSession();
session.setAttribute("name","zs");
String name = (String)session.getAttribute("name");

请求会话,设置会话属性。属性名为 "name",值是"zs",接收的时候是设定接收对象的属性名,因为返回类型是Object,所以需要强转。

session.removeAttribute("name");   //移除会话的属性名为"name"的信息

session.invalidate();              //杀死会话

生命周期

session的生命周期指的是从Servlet容器创建session对象到销毁的过程。Servlet容器会依据session对象设置的存活时间,在达到session时间后将session对象销毁。session生成后,只要用户继续访问,服务器就会更新session的最后访问时间,并维护该session。

有效期

session一般在内存中存放,内存空间本身大小就有一定的局限性,因此session需要采用一种过期删除的机制来确保session信息不会一直累积,来防止内存溢出的发生。

session的超时时间可以通过maxInactiveInterval属性来设置。

如果我们想让session失效的话,也可以当通过调用session的invalidate()来完成。

场景

比如用户A在浏览器注册界面点击验证码刷新,服务器端会传回验证码值,如果后端使用的技术不是Session而是直接采用的是web应用域(全局域),假设此时同时有个用户B也在刷新验证码,A请求返回的验证码值就会被B的请求值覆盖;而会话技术在一次完整的会话结束之前,不会被其它人覆盖。

二、Cookie技术

1、Cookie是javaweb提供的解决会话数据的存储相关技术

2 、Cookie是客户端技术,将会话产生的数据存储在客户端

3、 Cookie基于set-Cookie响应头,和Cookie请求头工作.

4 、当服务器需要保存相关会话数据时,通过set-Cookie响应头命令浏览器保存指定数据,浏览器收到这个命令后就会将数据保存在浏览器的Cookie中.

5 、之后当再次去访问服务器时,浏览器通过Cookie请求头将保存的数据再次带回服务器端,服务器可以从中获取数据.

6、 每一个浏览器各自保存各自的Cookie信息,保证数据不混乱

? ? ? 客户端? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 服务器端

在BuySerevlet类下:

public class BuyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String prod = request.getParameter("prod");
        response.setHeader("set-Cookie","prod="+prod);
    }

在PayServlet类下:

public class PayServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(request.getHeader("Cookie"));
    }

从客户端设置数据prod,通过set-Cookie响应头命令浏览器保存prod数据,浏览器收到这个命令后就会将数据保存在浏览器的Cookie中.

之后当再次去访问服务器时,浏览器通过Cookie请求头将保存的数据再次带回服务器端,服务器可以从中获取数据.

虽然Cookie是通过setHeader设置响应头来进行操作的,但是实际项目中由Cookie API提供相关方法来保存数据。

先new出Cookie对象:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie c1 = new Cookie("name","zs");
        c1.setMaxAge(60*60*24);
        c1.setPath(request.getContextPath()+"/");
        response.addCookie(c1);
    }

setMaxAge()是设置cookie保存数据在浏览器的留存时间(s为单位)

setPath()是设置cookie路径,在设置的路径下(包括其子路径),都会获得请求头信息。

addCookie()是通过set-Cookie响应头命令浏览器保存数据,浏览器通过Cookie请求头将保存的数据再次带回服务器端接收:request.getCookies();

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for(Cookie c : cookies){
                System.out.println(c.getName()+":"+c.getValue());
            }
        }
    }

接收返回类型是Cookie数组,不为空时,打印头中的名字和值信息。

文章来源:https://blog.csdn.net/SAKURAjinx/article/details/135535224
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。