Cookie,Session
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
一个网站怎么证明你来过:
1.cookie服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了;
2.seesion服务器登记你来过了,下次你来的时候我来匹配你;
保存会话的两种技术
cookie
-
客户端技术(响应,请求)
session
-
服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在Session中
Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
一个网站的cookie存在上限:
-
一个Cookie只能保存一个信息
-
一个web站点可以给浏览器发送多个cookie,最多存放20个
-
cookie,Cookie大小有限制4kb;
-
300个cookie浏览器上限
删除cookie:
-
不设置有效期,关闭浏览器,自动失效
-
设置有效期时间为0
编码解码
URLEncoder.encode("名字","utf8") URLDecoder.decode(cookie.getValue(),"utf8")
CookieDemo01
package com.lyj.cookie; 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; import java.io.PrintWriter; import java.util.Date; public class CookieDemo01 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"); PrintWriter out = resp.getWriter(); //cookie服务器端从客户端获取 Cookie[] cookies = req.getCookies();//返回数组,说明cookie可能存在多个 //判断cookie是否存在 if (cookies != null) { //如果cookie存在 out.write("你上一次访问的时间是"); for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; //获取cookie的名字 if(cookie.getName().equals("lastLoginTime")){ //获取cookie的值 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(3600*24); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
CookieDemo02
package com.lyj.cookie; 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 CookieDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建一个cookie,名字必须要和要删除的名字一致 Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); //将cookie有效期设置为0 cookie.setMaxAge(0); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
Session
-
服务器会给每一个用户(浏览器)创建一个Session对象
-
一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
-
用户登录之后,整个网站-->保存购物车的信息
Session自动过期
web.xml
<!--设置Session默认的失效时间--> <session-config> <!-- 1分钟后自动失效,以分钟为单位--> <session-timeout>1</session-timeout> </session-config>
Session和Cookie的区别:
-
Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
-
Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
-
Session对象由服务创建;
使用场景:
-
保存一个登录用户的信息
-
购物车信息
-
在整个网站中经常会使用的数据,将它保存在Session中
SessionDemo01
package com.lyj.cookie; 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 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;charset=UTF-8"); //得到Session HttpSession session = req.getSession(); //给Session中存东西 session.setAttribute("name","名字"); //获取Session的ID String sessionId = session.getId(); //判断Session是不是新创建的 if (session.isNew()){ resp.getWriter().write("session创建成功,ID:"+sessionId); }else { resp.getWriter().write("session已经在服务器中存在了,ID:"+sessionId); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
SessionDemo02
package com.lyj.cookie; 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 SessionDemo02 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;charset=UTF-8"); //得到Session HttpSession session = req.getSession(); String name = (String) session.getAttribute("name"); System.out.println(name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
SessioniDemo03
package com.lyj.cookie; 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 SessionDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.removeAttribute("name"); session.invalidate();//手动注销 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0"> <display-name>Welcome to Tomcat</display-name> <description>Welcome to Tomcat</description> <servlet> <servlet-name>CookieDemo01</servlet-name> <servlet-class>com.lyj.cookie.CookieDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieDemo01</servlet-name> <url-pattern>/cd1</url-pattern> </servlet-mapping> <servlet> <servlet-name>CookieDemo02</servlet-name> <servlet-class>com.lyj.cookie.CookieDemo02</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieDemo02</servlet-name> <url-pattern>/cd2</url-pattern> </servlet-mapping> <servlet> <servlet-name>SessionDemo01</servlet-name> <servlet-class>com.lyj.cookie.SessionDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionDemo01</servlet-name> <url-pattern>/sd1</url-pattern> </servlet-mapping> <servlet> <servlet-name>SessionDemo02</servlet-name> <servlet-class>com.lyj.cookie.SessionDemo02</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionDemo02</servlet-name> <url-pattern>/sd2</url-pattern> </servlet-mapping> <servlet> <servlet-name>SessionDemo03</servlet-name> <servlet-class>com.lyj.cookie.SessionDemo03</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionDemo03</servlet-name> <url-pattern>/sd3</url-pattern> </servlet-mapping> <!--设置Session默认的失效时间--> <session-config> <!-- 1分钟后自动失效,以分钟为单位--> <session-timeout>1</session-timeout> </session-config> </web-app>