什么是 cookie?
- cookie 翻译过来是饼干的意思
- cookie 是服务器通知客户端保存键值对的一种技术
- 客户端有了 cookie 后,每次请求都发送送给服务器
- 每个 cookie 的大小不能超过 4kb
分析:
baseServlet 页面
package com.aiguigu.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; public abstract class baseServlet 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 { //解决post请求中文乱码问题 //一定要在获取请求参数之前调用才有效 // req.setCharacterEncoding("UFT-8"); //解决响应中文乱码问题 resp.setContentType("text/html; charset=UTF-8"); String action = req.getParameter("action"); try { //获取 action 业务鉴别字符串,获取相应的业务,方法反射对象 Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); //调用目标业务 方法 method.invoke(this,req,resp); } catch (Exception e) { e.printStackTrace(); } } }
cookieServlet 页面
package com.aiguigu.servlet; import javax.servlet.ServletException; import javax.servlet.http.cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class cookieServlet extends baseServlet { protected void createcookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.创建cookie对象 cookie cookie = new cookie("key1", "value1"); //2.通知客户端保存cookie resp.addcookie(cookie); resp.getWriter().write("cookie创建成功"); //1.创建cookie对象 cookie cookie2 = new cookie("key2", "value2"); //2.通知客户端保存cookie resp.addcookie(cookie2); resp.getWriter().write("cookie创建成功"); } }
Web页面
在 cookie.html页面的 head标签 添加 base路径
一般base路径为工程路径
在 cookie创建 的a标签 添加 跳转界面,跳转到 cookieServlet 页面,并且附上Servlet端要使用的方法 action=createcookie
运行效果:
- 在 cookieServlet 页面 添加一个 getcookie()方法:
public class cookieServlet extends baseServlet { protected void getcookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { cookie[] cookies = req.getcookies(); for (cookie cookie : cookies){ if ("key2".equals(cookie.getName())){ resp.getWriter().write("找到了需要的cookie"); break; } } }
- 在 cookie.html 页面 的 cookie的获取 a标签中 修改跳转页面和跳转时调用的方法
运行效果:
- 将查找指定的cookie值 提取成工具类
package com.aiguigu.util; import javax.servlet.http.cookie; public class cookieUtils { public static cookie findcookie(String name,cookie[] cookies){ if (name == null||cookies == null||cookies.length ==0){ return null; } for (cookie cookie : cookies) { if (name.equals(cookie.getName())){ return cookie; } } return null; } }
使用该工具类
package com.aiguigu.servlet; import com.aiguigu.util.cookieUtils; import javax.servlet.ServletException; import javax.servlet.http.cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class cookieServlet extends baseServlet { protected void getcookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { cookie[] cookies = req.getcookies(); cookie iWantcookie = cookieUtils.findcookie("key2",cookies); if (iWantcookie != null){ resp.getWriter().write("找到了需要的cookie"); } } }
运行效果:
第一种:
protected void updatecookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.先创建一个要修改的同名的cookie对象 //2.在构造器,同时赋于新的 cookie值 cookie cookie = new cookie("key1","newValue1"); //3.调用 resp.addcookie(cookie);;通知 客户端 保存修改 resp.addcookie(cookie); resp.getWriter().write("修改好了"); }
第二种:
protected void updatecookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.先查找到需要修改的cookie对象 cookie cookie = cookieUtils.findcookie("key2",req.getcookies()); //2.调用 setValue()方法赋予新的cookie值 cookie.setValue("newVlaue2"); //3.调用resp.addcookie(cookie);通知 客户端 保存修改 resp.addcookie(cookie); resp.getWriter().write("修改好了"); }
运行结果:
注意:
谷歌浏览器查看cookie:
火狐浏览器查看cookie:
cookie 的生命控制指的是如何管理 cookie 什么时候被销毁(删除)
setMaxAge()
整数,表示在指定的秒数后过期
负数,表示浏览器一关,cookie就会被删除
零,表示马上删除 cookie
负数
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { cookie cookie = new cookie("defaultLift","defaultLife"); cookie.setMaxAge(-1);//设置存活时间 resp.addcookie(cookie); }
-1 是默认值,浏览器一关。cookie就会被删除
1.6、cookie 有效路径 Path 的设置cookie 的 path 属性可以有效的过滤哪些 cookie 可以发送给服务器。哪些不发。
path 属性是通过请求的地址来进行有效的过滤
cookieA path=/工程路径
cookieB path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html
cookieA 发送
cookieB 不发送
请求地址如下:
http://ip:port/工程路径/abc/a.html
cookieA 发送
cookieB 发送
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { cookie cookie = new cookie("path1","path1"); //req.getContextPath() ===>>> 得到工程路径 cookie.setPath(req.getContextPath()); cookie cookie2 = new cookie("path2","path2"); //req.getContextPath() ===>>> 得到工程路径 cookie2.setPath(req.getContextPath() + "/abc"); resp.addcookie(cookie); resp.addcookie(cookie2); resp.getWriter().write("已经创建一个带有Path路径的cookie"); }1.7、练习之免用户登录
分析:
实现
客户端:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>Title
服务器端:LoginServlet
package com.aiguigu.servlet; import javax.servlet.ServletException; import javax.servlet.http.cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); if ("qwe123".equals(username)&&"123qwe".equals(password)){ //登录成功 cookie cookie = new cookie("username", username); cookie.setMaxAge(60 * 60 * 21 *7); resp.addcookie(cookie); System.out.println("登录成功"); }else { //登录失败 System.out.println("登录失败"); } } }2、Session 2.1、什么是 Session 会话?
- Session 就是一个接口(HttpSession)。
- Session 就会会话。它是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个Session会话
- Session 会话中,我们经常用来保存用户登录之后的信息
创建和获取 Session。它们的API是一样的。
request.getSession()
第一次调用是:创建Session 会话
之后调用都是:获取前面创建好的 Session 会话对象
isNew():判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份z号。也就是ID值。而且这个ID 是唯一的。
getId()得到 Session 的会话 id值。
创建和获取 Session
protected void creatSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建和获取Session会话对象 HttpSession session = req.getSession(); //判断当前的Session会话,是不是新创建出来的 boolean aNew = session.isNew(); //获取Session唯一标识 String id = session.getId(); resp.getWriter().write("得到的Session,它的id是:" + id + "
"); resp.getWriter().write("这个Session是否是新创建的:" + aNew + "
"); } protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().setAttribute("key1","value1"); resp.getWriter().write("值已经设置好了"); } protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Object key1 = req.getSession().getAttribute("key1"); resp.getWriter().write("从Session域中获取出的数据是:" + key1); }
修改 session.html页面的 对应 a 标签的 跳转页面和调用方法
运行结果
分析:
public void setMaxInactiveInterval(int interval); 设置的超时时间(以秒为单位),超时指定的时长,Session 就会被销毁。
public int getMaxInactiveInterval() 获取 Session 的超时时间
public void invalidate() 让当前 Session 会话马上超时无效。
Session 默认的超时时长为30分钟
因为在Tomcat 服务器的配置文件 web.xml 中 默认有以下配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为:30分钟。
30
可以在这个配置中修改 Session 的默认超时时长
代码:
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建和获取Session会话对象 HttpSession session = req.getSession(); //设置当前Session3秒后超时 session.setMaxInactiveInterval(3); }2.4、浏览器 和 Session 之前关联的技术内幕
Session 技术,底层其实是基于 cookie 技术来实现的。
https://www.bilibili.com/video/BV1Y7411K7zz?p=269
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)