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/> " + 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:
![](https://zhoux.top/img/markdown/screenshot/20210728104908.png)
运行程序,首次启动浏览器时,请求头中没有cookie,Java中会在响应头中设置一个值为1的cookie给客户端, 下次刷新请求时将在请求header中请求到服务端。
![](https://zhoux.top/img/markdown/screenshot/20210728105523.png)
刷新浏览器请求,请求header中出现了上次设置给客户端的cookie:1。此时Java程序会设置时效为0的cookie, 客户端收到后会清除该cookie,再下次请求时header中将没有自定义cookie(和首次启动浏览一样)。cookie 失效时间如果不设置,默认的将会在关闭浏览器时自动清理。
![](https://zhoux.top/img/markdown/screenshot/20210728110540.png)
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中的值。
![](https://zhoux.top/img/markdown/screenshot/20210728143335.png)
![](https://zhoux.top/img/markdown/screenshot/20210728143754.png)
3、区别
cookie和session区别如下:cookie | session |
存放在客户端 | 存放在服务端 |
不安全 | 安全 |
性能高 | 访问多性能下降 |
大小<4K | 大小无限制 |