JAVAWeb - Cookie和Session
一.会话
会话:用户打开了一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话。
有状态会话:
你怎么证明你是重工的学生?
你 重工
1.发票 重工给你缴费的发票
2.学校的点名册 重工标记了你来过学校
同理:一个网站怎么证明你来过了?
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问服务端带上信件即可:(cookie)
2.服务器登记你来过了,下次来的时候继续匹配你:(seesion)
二.保存会话的两种技术
cookie: 客户端技术(响应,请求)
seesion:服务器技术,利用这个技术,可以保存用户的会话信息,可以把数据保存在session中
常见引用:
访问网站时,第一次访问时登录以后,下次再来访问就可以不用登录了
三.Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端Cookie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //保存用户上一次访问的时间 public class CookieDome01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器会记录你来的时间,把这个时间封装成为一个信件,下次访问的时候,就可以知道你上次多久来的 //解决中文乱码 req.setCharacterEncoding( "utf-8" ); resp.setCharacterEncoding( "utf-8" ); PrintWriter out = resp.getWriter(); //输出对象,用于输出一些文字的 //cookie 服务器从客户端获取 Cookie[] cookies = req.getCookies(); //这里返回数组,说明cookie可能存在多个 //判断cookie 是否纯在 if (cookies!= null ){ //如果存在,就输出上次访问的时间 for ( int i = 0 ; i <cookies.length ; i++) { Cookie cookie = cookies[i]; //获取cookies的名字 if (cookie.getName().equals( "lastLoginTime" )){ //获取cookies的值 out.write( "您上一次访问的时间是:" ); long lastLoginTime = Long.parseLong(cookie.getValue()); //这一步才是获得时间的方法 Date date = new Date(lastLoginTime); out.write(date.toLocaleString()); } } } else { out.write( "这是您第一次访问!" ); } //当用户第一次访问时候给用户发一个cookie Cookie cookie = new Cookie( "lastLoginTime" , System.currentTimeMillis()+ "" ); cookie.setMaxAge( 24 * 60 * 60 ); //设置cookies有效期为1天 resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } |
我们在使用cookie中所用到的方法
1. Cookie[] cookies = req.getCookies();//获得cookie
2. cookie.getName() 获得cookie 中key(名字) equals:判断两个对象的值是否相等
3. cookie.getValue() 获得cookie中的vlaue
4. Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");用户是第一次访问的时候这个申请的cookie是服务器发给客户端的
5. cookie.setMaxAge(24*60*60); 设置cookie的有效期
6. resp.addCookie(cookie); 响应客户端的cookie ,因为cookie每次都在变化,所以不管是第一次还是多次访问以后,都需要一个新的cookie
补充:
cookies:一般会保存在本地的目录下 在用户目录下的 appdata
一个网站的cookie是否存在上线?
a.一个cookie只能保存一个信息
b.一个web服务器可以向浏览器发送多个cookie,最多放置20个cookie
c. cookie大小有限制:4KB
d. 浏览器最多可以接收300个cookie
删除cookies
a.不设置有效期,关闭浏览器,自动消失
b.设置cookie的有效期为 0
解决servlet中文乱码问题
resp.setHeader("content-type","text/html;charset=UTF-8");
URLEncoder.encode("马明","utf-8")//编码
URLDecoder.decode(cookie.getValue(),"utf-8")//解码
Session(重点)
服务器会给每个用户(浏览器)创建一个session对象
一个session独占一个浏览器,只要浏览器没有关闭,这个session就一直存在
用户登录之后,整个网站拓展都可以访问=====保存用户信息,保存购物车信息
session和cookie的区别
cookie是把用户的数据写给用户浏览器,浏览器保存(可以保存多个)
session把用户的数据写到用户独占的session中,服务器端保存(保存重要信息,减少资源浪费)
session对象由服务器创建
常见应用
保存用户的登录信息
购物车信息
整个网站中经常会使用的数据,保存在网站中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决中文乱码问题 req.setCharacterEncoding( "utf-8" ); resp.setCharacterEncoding( "utf-8" ); resp.setContentType( "text/html;charest=utf-8" ); //得到session HttpSession session = req.getSession(); //给session存东西 session.setAttribute( "name" , new presion( "马明" , 19 )); //获得session的id String id = session.getId(); //判断按session是不是创建成功 if (session.isNew()){ resp.getWriter().write( "session创建成功,ID:" +id); } else { resp.getWriter().write( "session已经在服务器中存在了,ID:" +id); } //session创建的时候做了什么事情 //实际上session就是创建的一个cookie,然后带回了浏览器 /*Cookie cookie = new Cookie("name", id); resp.addCookie(cookie);*/ } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } |
session的创建步骤和cookie的差不多,只是使用的方法一个是属于cookie方法,一个是session方法
a.得到session对象 HttpSession session = req.getSession();
b.给session中存入东西 session.setAttribute()
c.获得session的id String id = session.getId();
d.判断session是否创建成功 session.isNew() 返回的是布尔值(T or F)
e. session.getAttribute()拿到session的属性:可能是字符串,也可能是对象
f. session.removeAttribute("name");
session.invalidate();
手动注销session
会话自动过期:web.xml中配置
<session-config> <!--session自动过期,以分钟为单位--> <session-timeout>15</session-timeout> </session-config>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现