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/> " + 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();
}
}
}
}
说明:运行vb.net教程程序,浏览器首次请求时c#教程服务端没有session,此时会分配一个sessionid,通过cookie返回给浏览器, 下次浏览器刷新请求时,会带上此sessionid,服务端根据此sessionid找到session对象,并取出存在该 session中的值。
3、区别
cookie和session区别如下:
cookie | session |
存放在客户端 | 存放在服务端 |
不安全 | 安全 |
性能高 | 访问多性能下降 |
大小<4K | 大小无限制 |