文章目录
Cookie
饼干. 其实是一份小数据, 是服务器给客户端,并且存储在客户端上的一份小数据
应用场景
自动登录、浏览记录、购物车。
为什么要有这个Cookie
http的请求是无状态。 客户端与服务器在通讯的时候,是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端以前有没有来访问过。 为了更好的用户体验,更好的交互 [自动登录],其实从公司层面讲,就是为了更好的收集用户习惯[大数据]
Cookie怎么用
添加Cookie给客户端
- 在响应的时候,添加cookie
Cookie cookie = new Cookie("aa", "bb");
//给响应,添加一个cookie
response.addCookie(cookie);
- 客户端收到的信息里面,响应头中多了一个字段 Set-Cookie
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NKLqpjFd-1583496353227)(img/img02.png)]
获取客户端带过来的Cookie
//获取客户端带过来的cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie c : cookies) {
String cookieName = c.getName();
String cookieValue = c.getValue();
System.out.println(cookieName + " = "+ cookieValue);
}
}
清除Cookie
Cookie没有提供delete方法,我们要删除需要设置maxAge 为0 。
Cookie cookie = new Cookie("history","");
cookie.setMaxAge(0); //设置立即删除
cookie.setPath("/CookieDemo02");
response.addCookie(cookie);
其他常用方法
//关闭浏览器后,cookie就没有了。 ---> 针对没有设置cookie的有效期。
// expiry: 有效 以秒计算。
//正值 : 表示 在这个数字过后,cookie将会失效。
//负值: 关闭浏览器,那么cookie就失效, 默认值是 -1
cookie.setMaxAge(60 * 60 * 24 * 7);
//赋值新的值
//cookie.setValue(newValue);
//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(".itheima.com");
//只有访问该域名下的cookieDemo的这个路径地址才会带cookie
cookie.setPath("/CookieDemo");
Cookie示例 实现记住密码功能
- 用户打开网站后,自动读取Cookie中存储的用户名、密码
- 如果存在,自动填充到表单中
- 如果不存在,说明是第一次登录,需要登录后在后台将用户名、密码写入Cookie中,以便下次登录时自动填充
主要实现代码
前端登录页
<body>
<form action="LoginServlet" method="post">
用户名: <input id="username" type="text" name="userName" οnblur="inputPwd()" >
<br />
密 码:
<input id="pwd" type="password" name="password">
<br />
<input type="checkbox" name="remeber_me" value="true" /> 记住密码
<br />
<input type="submit" value="登录">
</form>
</body>
<!-- 引入js操作Cookie的第三方库,也可以使用原生js API -->
<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
<script type="text/javascript">
// 从cookies里面按照用户输入的username去查找对应的password,
// 如果找到,说明用户已经登录成功过,并且已经记录到cookie里。
// 我们直接把对应的密码从cookie中拿出来,设置password密码框里
// my_cookies其实就是一个map, 存储了所有的cookie键值对
var my_cookies = Cookies.get();
console.log(my_cookies);
var pwdInput = document.getElementById("pwd");
var username = document.getElementById("username");
// 当输入完用户名,文本框失去焦点时,去cookie中找对应的密码,
// 如果找到,直接填充到密码框里
function inputPwd() {
var userName = username.value;
var cookieKey = "username-" + userName;
console.log(cookieKey);
var cookiePwd = my_cookies[cookieKey];
console.log(cookiePwd);
if(cookiePwd) {
pwdInput.value = cookiePwd;
}
}
</script>
后台处理代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
// 获取前台表单提交的用户名、密码
String userName = request.getParameter("userName");
String password = request.getParameter("password");
// 获取前台是否勾上了记住密码
String sRemeber = request.getParameter("remeber_me");
boolean remeber = false;
try {
remeber = Boolean.parseBoolean(sRemeber);
} catch (Exception e) {
}
// 设置响应格式和编码
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
if(isBlank(userName) || isBlank(password)) {
out.println("<script>alert('用户名或密码不能为空!'); window.location.href='login.jsp';</script>");
return;
}
if(!userAccountData.containsKey(userName)) {
out.println("<script>alert('不好意思,您还没有注册!'); window.location.href='login.jsp';</script>");
return;
}
String orginPassword = userAccountData.get(userName);
if(password.startsWith("pwd-")) {
password = password.substring(4);
}
if(orginPassword.equals(password)) {
out.println("登录成功!");
if(remeber) {
Cookie cookie = new Cookie("username-" + userName, "pwd-" + password);
cookie.setMaxAge(120);
response.addCookie(cookie);
}
return;
} else {
out.println("<script>alert('用户名或密码不正确,请重新输入!'); window.location.href='login.jsp';</script>");
return;
}
}
Cookie总结
-
服务器给客户端发送过来的一小份数据,并且存放在客户端上。
-
创建Cookie:
使用new来创建Cookie对象
Cookie cookie = new Cookie("xxx", "wangzhenongyao");
-
添加cookie
添加cookie通过响应对象的addCookie方法
// 底层实现原理其实是在响应头中添加了一个: Set-Cookie: password=qiaoshouyuan; Max-Age=60; Expires=Fri, 20-Sep-2019 08:41:19 GMT; HttpOnly response.addCookie();
-
获取cookie
Cookie[] cookies = request.getCookies();
-
Cookie有效时间
-
会话Cookie
默认情况下,关闭了浏览器,那么cookie就会消失。
这是默认的行为,但是大部分现代的浏览器都不会这么做,比如chrome浏览器,默认打开时会恢复上次关闭时的状态,所有关闭浏览器cookie并不会失效。 我们可以设置浏览器打开时不恢复上次状态,改为打开新的标签页即可。
-
持久Cookie
通过设置MaxAge指定存活时间,在存活时间内,都有效,并且会保存在客户端上。
cookie.setMaxAge(0); //设置立即删除 cookie.setMaxAge(100); //100 秒
-
-
Cookie的安全问题。
由于Cookie会保存在客户端上,所以有安全隐患问题。 还有一个问题, Cookie的大小与个数有限制。 为了解决这个问题 —> Session .
-
Cookie不能直接存储中文,需要做转码
Session
会话 , Session是基于Cookie的一种会话机制。 Cookie是服务器返回一小份数据给客户端,并且存放在客户端上。 Session是,数据存放在服务器端。
常用API
//得到会话ID
String id = session.getId();
//存值
session.setAttribute(name, value);
//取值
session.getAttribute(name);
//移除值
session.removeAttribute(name);
Session创建和销毁
创建
在调用所有可以获取session的页面中(如:JSP、Servlet),就会创建Session,并且浏览器Cookie中也会生成JSESSIONID
获取Session
request.getSession();
销毁
session 是存放在服务器的内存中的一份数据。
- 关闭服务器
- session会话时间过期。 有效期过了,默认有效期: 30分钟。
移除Session中的元素
//强制干掉会话,里面存放的任何数据就都没有了。
session.invalidate();
//从session中移除某一个数据
//session.removeAttribute("cart");
总结:
Cookie
服务器给客户端发送一小份数据, 存放在客户端上。
基本用法:
添加cookie
获取cookie。
什么时候有cookie
response.addCookie(new Cookie())
Cookie 分类
-
会话Cookie
关闭浏览器,就失效
-
持久cookie
存放在客户端上。 在指定的期限内有效。
setMaxAge();
Session
也是基于cookie的一种会话技术, 数据存放存放在服务器端,会在cookie里面添加一个字段 JSESSIONID . 是tomcat服务器生成。
常用API
setAttribute 存数据
getAttribute 取数据
removeAttribute 移除数据
req.getRequestedSessionId(); 获取会话id
session.getId(); 获取会话id
invalidate() 强制让会话失效。
创建和销毁
- 创建: 首次访问所有可以调用request.getSession方法的页面时,session创建,同时JSESSIONID也会生成
- 销毁:
- 关闭浏览器
- 会话超时(默认是30分钟)
- 服务端调用invalidate
Cookie和Session的区别
- Cookie数据存放到客户端(浏览器),Session存放在服务端;
- Cookie存放的数据大小有限制,不能超过4k;很多浏览器都限制一个站点最多保存20个cookie。
- Cookie由于存放在客户端硬盘上,所以相较于Session来说安全性低一点;
- cookie失效时间是通过setMaxAge来设置,session是通过setInactiveInterval方法设置
- Cookie中只能存储字符串的值,而且还不能中文。而Session中可以存储任意语言的字符串,或者Java中的所有类型。
- Cookie是由程序员在业务代码中自己创建的,而Session是由容器创建的。
Cookie和Session的关系
HTTP协议本身是无状态的,也就是说服务端无法通过一个请求判断出谁是谁,而Session作为服务端跟踪用户状态的一项技术,在整个容器中存在很多份数据。如何知道一个请求进来应该拿哪份Session数据这是个问题。那么要解决这个问题,我们需要在请求中添加一个标识,Cookie技术就解决了这个问题。具体来说,Tomcat会在浏览器第一次访问JSP、Servlet时分配一个独一无二的Cookie标识(JSESSIONID),写到浏览器端。后续每次请求时,浏览器会携带这个标识,进而服务端就可以区分出来谁是谁,然后拿对应的Session数据。
来源:CSDN
作者:两人走
链接:https://blog.csdn.net/weixin_43862280/article/details/104703188