java web-cookie session

java web-cookie session

java web-cookie session

1、cookie

Cookie 是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供 该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录 用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序。Cookie是一段不超过4KB的小型 文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安 全性、使用范围的可选属性组成。

下面编写CookieServlet测试简单的cookie属性:
package com.zx.demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class CookieServlet extends HttpServlet {
private static final String COOKIE_KEY_COUNT = "COOKIE_KEY_COUNT";

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //处理中文乱码
    resp.addHeader("content-type", "text/html;charset=utf-8");

    Cookie cookie = null;
    Cookie[] cookies = req.getCookies();
    for (Cookie c : cookies) {
        if (c.getName().equals(COOKIE_KEY_COUNT)) {
            cookie = c;
        }
    }

    if (cookie == null) {
        resp.getWriter().write("没有cookie");
        cookie = new Cookie(COOKIE_KEY_COUNT, 2 + "");
    } else {
        resp.getWriter().write("有cookie:<br/>&nbsp;&nbsp;&nbsp;&nbsp;" + cookie.getValue());
    }

    //cookie值-1
    int cookieValue = Integer.parseInt(cookie.getValue()) - 1;
    cookie.setValue(cookieValue+"");

    if (cookieValue <= 0) {
        //设置有效期为0-清除cookie
        cookie.setMaxAge(0);
    }
    resp.addCookie(cookie);
}

}


配置web.xml,添加cookie servlet:



运行程序,首次启动浏览器时,请求头中没有cookie,Java中会在响应头中设置一个值为1的cookie给客户端, 下次刷新请求时将在请求header中请求到服务端。


刷新浏览器请求,请求header中出现了上次设置给客户端的cookie:1。此时Java程序会设置时效为0的cookie, 客户端收到后会清除该cookie,再下次请求时header中将没有自定义cookie(和首次启动浏览一样)。cookie 失效时间如果不设置,默认的将会在关闭浏览器时自动清理。


2、session

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的 属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢 失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话 ,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储 在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意 会话状态仅在支持cookie的浏览器中保留。

编写Java代码,实现简单session属性验证:
package com.zx.demo;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

public class SessionServlet extends HttpServlet {
private static final String SESSION_KEY = "SESSION_KEY";

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.addHeader("Content-Type", "text/html;charset=utf-8");
    HttpSession session = req.getSession();
    if (session != null) {
        Object value = session.getAttribute(SESSION_KEY);
        resp.getWriter().write("session:" + value);
        if (value == null) {
            session.setAttribute(SESSION_KEY, 1);
        } else {
            //销毁session
            session.invalidate();
        }
    }
}

}


说明:运行程序,浏览器首次请求时服务端没有session,此时会分配一个sessionid,通过cookie返回给浏览器, 下次浏览器刷新请求时,会带上此sessionid,服务端根据此sessionid找到session对象,并取出存在该 session中的值。




3、区别

cookie和session区别如下:
cookie session
存放在客户端 存放在服务端
不安全 安全
性能高 访问多性能下降
大小<4K 大小无限制