7、Session、Cookie
7.1 会话
会话:用户打开一个浏览器,点击了连接,浏览了web资源,关闭浏览器,这个过程就称之为会话
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话
一个网站,怎么证明你浏览过?(客户端)——》(服务端)
-
服务端给客户端一个信件(cookie),客户端下次访问服务端带上信件(cookie)就可以了,
-
服务端登记你来过了,下次你来的时候我来匹配你;(session)
7.2、保持会话的两种技术
cookie
-
客户端技术(响应,请求)
session
-
服务器技术(利用这个技术可以保存用户的会话信息,可以把信息或者数据放在session中)
应用场景:网站登录
7.3、cookie
-
从请求中获取cookie信息
-
服务器响应给客户端
req.getCookies(); //获得cookie cookie.getName(); //获得名字 cookie.getValue(); //获得内容 Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis())); //新建 cookie.setMaxAge(); //设置cookie有效期 resp.addCookie(cookie) //响应给客户端一个cookie
cookie:一般会保存在本地的 用户目录下 AppData;
一个网站cookie是否存在上限?
-
一个cookie只能保存一个信息
-
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
-
cookie大小有限制
-
浏览器上限大概为300个
删除cookie:
-
不设置有效期,关闭浏览器,自动失效
-
设置有效期时间为0(建议另一个同名cookie,设置有效期为0,并发送这个cookie,前面的cookie就被覆盖,达到关闭cookie的作用)
-
编码解码
Cookie cookie = new Cookie("name",URLEncoder.encond("刘正伟","utf-8")); pw.write(URLDecoder.decode(cookie.getValue(),"utf-8"));
7.4、Session
session(会话):
-
服务器会给每一个用户创建一个session对象
-
一个Session独占一个浏览器
-
用户登陆之后,可以访问该站点每一个页面
Session和cookie的区别:
-
cookie是把用户的数据写给用户的浏览器,浏览器保存
-
Session十八用户的信息写到用户独占Session中,服务器端保存,
-
Session对象由服务器创建
使用场景:
-
保持一个登陆用户信息
-
购物车信息
-
在整个网站中经常会使用的数据,将他保存在Session中
SessionDemo1
package com.liu.cookiesession; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; /** * @version 1.0 * @description:TODO * @Author: * @date :2021/9/21 16:22 */ public class SessionDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题 resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //得到Session HttpSession session = req.getSession(); //给Session中放入数据 session.setAttribute("person",new person1("刘正伟",22,1999,0)); String id = session.getId(); boolean aNew = session.isNew(); PrintWriter pw = resp.getWriter(); pw.write("sessionId is:"+id+"\nSession isNew is:"+aNew); //session.removeAttribute("name"); 可以指定销毁session中的某个属性 //session.invalidate(); 手动注销一个session } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
public class SessionDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //编码 resp.setCharacterEncoding("utf-8"); req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //得到Session HttpSession session = req.getSession(); person1 name = (person1)session.getAttribute("person"); System.out.println(name.toString()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
手动注销
session.removeAttribute("name"); //可以指定销毁session中的某个属性 session.invalidate(); //手动注销一个session
自动注销
<!-- 设置Session的有效时间--> <session-config> <session-timeout>1</session-timeout> <!--设置超时时间,以分钟为单位--> </session-config>