5.Cookie
5.1介绍
- Cookie是在web浏览器访问web服务器上的某个资源时,由web服务器在响应浏览器通过响应头附带的传送给浏览器并存储在 浏览器端的一小段数据
5.2使用
-
创建两个类,一个类写Cookie,一个类读Cookie
- 都继承HttpServlet类和配置xml信息
-
写cookie
-
package CookieServlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; 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.OutputStream; import java.io.PrintWriter; @WebServlet("/wrist") public class wrist extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建cookie(可以同时创建多个cookie) Cookie cookie = new Cookie("key","value"); //设置cookie的生命周期(秒) //参数等于0时,关闭浏览器即销毁cookie cookie.setMaxAge(24*60*60); //响应信息 resp.setStatus(200); resp.setContentType("text/html;charset=utf-8"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); //返回什么数据 out.println("<!DOCTYPE html"); out.println("<html>"); out.println("<head><meta charset= utf-8>"); out.println("<title>Cookie使用</title>"); out.println("</head"); out.println("<body>"); out.println("<a href='read'>访问cookie</a>"); out.println("</body>"); out.println("</html>"); //关闭和刷新out out.flush(); out.close(); } }
-
-
读cookie
-
package CookieServlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/read") public class read extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //读取cookie(cookie能有多个,所以用数组) Cookie[] cookies = req.getCookies(); //遍历数组 for(Cookie cookie: cookies){ if("key".equals(cookie.getName())){ String value = cookie.getValue(); System.out.println("key的值为:"+value); } } } }
-
5.3优缺点
- 优点
- 可以灵活的配置过期规则
- 简洁:cookie中存储的是最简单的键值对格式的文本数据
- 数据的持久性,保存到浏览器中的cookie在过期之前是持久存储的
- 缺点
- 存储数据的大小,大多浏览器支持4k 8k的数据存储
- 用户可以通过浏览器设置禁用Cookie,因此限制了cookie的使用场景(如果-定要使用cookie, 可以检查浏览器cookie是否可用,如果不可用提醒用户设置开启cookie)
- cookie是存储在客户端浏览器中的,有被纂改的风险,有潜在的安全隐患
6.Session
6.1原理
- 当客户端浏览器(第1次)请求服务器时, 服务器会为当前客户端连接创建一个Session对象, 同时将sessionID通过Cookie响应给客户端,并存储在客户端;
- 当客户端端再次请求服务器的时候,会通过请求头携带存储sessionID的cookie, 服务器接收请求之后获取cookie中的sessionID,通过这个sessionID获取第一 次连接时创建Session对象。
6.2使用
-
创建两个类,一个类写Session,一个类读Session
- 都继承HttpServlet类和配置xml信息
-
写Session
-
package SessionServlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/SessionWrist") public class SessionWrist extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建Session,getSession()--获取当前用户连接 HttpSession session = req.getSession(); //getId();---获取sessionID String sessionId = session.getId(); //将数据保存到session对象 session.setAttribute("key","Hello Session"); } }
-
-
读Session
-
package SessionServlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/SessionRead") public class SessionRead extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建Session,getSession()--获取当前用户连接 HttpSession session = req.getSession(); //从session对象中取数据 String string = (String)session.getAttribute("key"); System.out.println("SessionRead:"+string); } }
-
6.3Session数据操作
-
//创建session对象 HttpSession session = req.getSession(); //将数据保存到session对象 session.setAttribute("key","Hello Session"); //从session对象获取数据(对应key值) session.getAttribute("key"); //修改session对象数据(对应的key值,修改后的值) session.setAttribute("key","HttpSession"); //删除session对象数据(对应的key值) session.removeAttribute("key"); //设置session对象最大存活时间(秒),超过这个时间session对象自动就会销毁 session.setMaxInactiveInterval(60); //手动销毁session对象 session.Invalidate();
6.4Session对象失效
- 后果
- 一个客户端的多次请求正常情况下获取到的是同一个session对象,也是正式因为多次请求获取的是同一个session对象才实现了session中存储的用户状态可以作用于请求。
- 如果session失效,将会导致session失效的后的请求无法获取之前的session对象,也就是说多次请求获取的不是同一个session。
- 产生
- 客户端禁用Cookie, 或者客户端在两次请求之间清除了cookie,将导致下一-次请求无法获取上-一次请求创建的Cookie;
- session是有生命周期的,当客户端请求服务器建立连接之后,服务器会为此会话创建session对象,如果客户端的两次请求时间间隔>session过期时间(默认30min),服务 器会将之前创建的ession对象销毁;
- 解决
- 如果客户端禁用了Cookie:不能通过cookie来记录、传递sessionld, 我们可以通过重写URL, 使用url传递sessionID (在url 上追加sessionld)
- 如果session过期:我们可以根据系统的需求灵活设置session的生命周期或者手动销毁session对象
6.5request与session区别
- request对象用于获取用户的请求数据,作用于浏览器和服务器的一次请求
- session对象用于记录当前用户的状态,作用于一个客户端的多次请求
- 浏览器请求ServletA. ServletA转发到ServletC
- ServletC与ServletA同属于一次请求, 共享同一个request对象, 都可以通过request获取浏览器提交的数据
- 浏览器请求ServletB, ServletB重定向到SenvletD
- 重定向到ServletD,ServletB 与ServletD是浏览器的两次请求,ServletD中的request与ServletB是不同的对象
6.6ServletConText
6.6.1介绍
-
HttpServletRequest对象作用于一次用户请求,获取用户数据
-
HttpSession对象作用于一个用户的多次请求,实现数据共享
-
ServletContext对象作用于整个javaweb项目,实现多个用户之间的数据共享
ServletContext是Javaweb项目的全局对象,包含当前web项目在web服务器中的信息,同时他也是个域对象,可以实现访问当前web项目的所有用户之间的数据共享
6.6.2使用
-
//获取ServletContext对象 ServletContext servletContext = getServletContext(); //获取当前web应用的访问路径 String contText = servletContext.getContextPath(); //request对象获取访问路径 String contextPath = req.getContextPath(); //获取web项目中的目录(绝对路径),参数为文件名 String realPath = servletContext.getRealPath("/CookieServlet"); //将数据存储到全局对象 servlet.serAttribute("key","value"); //根据key从全局对象取数据 servlet.getAttribute("key"); //从全局对象移出数据 servletContext.removeAttribute("key"); //获取web.xml配置中的全局参数 ServletContext.getInitParameterNames(); //根据key获取value servletContext.getInitParameter("key");
-
<!--配置context信息--> <web-app> <context-param> <param-name>key</param-name> <param-value>value</param-value> </context-param> </web-app>
6.7ServletConfig
-
ServletConfig对象表示的一个Servlet在web服务器的配置信息
-
//获取当前servlet类的ServletConfig对象 ServletCpnfig servletConfig = getServletConfig(); //通过ServletConfig获取当前Servlet类路径 servletConfig.getServletName(); //通过ServletConfig对象加载当前servlet类的初始化参数 //获取当前servlet所有初始化参数的key getInitParameterNames(); //根据key获取value getInitParameter("key");