本文章基于B站UP主:楠哥教你学Java 的课程《Java Web从入门到实战【完整版】》进行整理补充,本文章仅用于个人学习交流使用。
Cookie是存储在浏览器里面的一个东西,不属于JSP内置对象,是一个全新的内容。
实现会话的一种机制,Cookie存储在客户端/浏览器,seeion存储在服务端。
Cookie 是服务端在 HTTP 响应中附带传给浏览器的⼀个⼩⽂本⽂件,⼀旦浏览器保存了某个 Cookie,在之后的请求和响应过程中,会将此 Cookie 来回传递,这样就可以通过 Cookie 这个载体完成客户端和服务端的数据交互。
用 key-value 的方式存储。
Cookie cookie=new Cookie("name","zhangsan");//创建
response.addCookie(cookie);//响应到客户端
Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
for (Cookie cookie2:cookies){
out.write(cookie2.toString()+"
");
out.write(cookie2.getName()+"
");//读取key
out.write(cookie2.getValue()+"
");//读取value
out.write("---------"+"
");
}
现在cookie只存储在打开当前项目的浏览器中,如果用新的浏览器打开 cookie.jsp 会报空指针异常,因为不同的浏览器都有着自己的cookie。如果关闭浏览器,再打开,cookie信息不会显示,因为默认情况下cookie的生命周期直到当前浏览器关闭。
void setMaxAge(int age) 设置 Cookie 的有效时间,单位为秒
int getMaxAge() 获取 Cookie 的有效时间
String getName() 获取 Cookie 的 name
String getValue() 获取 Cookie 的 value
Cookie[] cookies=request.getCookies();
out.write(cookies[0].getMaxAge());//?输出一个奇怪的符号
System.out.println(cookies[0].getMaxAge());//-1 默认值 直到浏览器关闭
保存的数据是 Object
会随着会话的结束⽽销毁
保存重要信息 **例如:**账号密码信息,如果保存在cookie,能通过cookie的本地文件获取到
保存的数据是 String
可以⻓期保存在浏览器中,⽆会话⽆关
保存不重要信息 **例如:**视频观看记录,再次打开上一次没看完的视频时会从断点处播放
存储⽤户信息方面:
session:
setAttribute(“name”,“admin”) 存
getAttribute(“name”) 取
⽣命周期:
服务端:只要 WEB 应⽤重启就销毁,
客户端:只要浏览器关闭就销毁。
退出登录: session.invalidate()
cookie:
response.addCookie(new Cookie(name,“admin”)) 存
取:
Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
for (Cookie cookie:cookies){ //只能通过遍历+条件判断的方式获取
if (cookie.getName().equals("name"))
out.write("用户名:"+cookie.getValue()+"
");
}
⽣命周期:
不随服务端的重启⽽销毁,
客户端:默认是只要关闭浏览器就销毁,我们通过 setMaxAge()⽅法设置有效期,⼀旦设置了有效期,则不随浏览器的关闭⽽销毁,⽽是由设置的时间来决定。
退出登录: setMaxAge(0)
描述:用cookie实现用户登录验证,使浏览器能够保存用户信息,即关闭浏览器再回到 welcome 界面时能够正常显示,并实现登出功能,即销毁session.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
head>
<body>
<form action="/cookielogin" method="post">
<table>
<tr>
<td>用户名:td>
<td><input type="text" name="username"/>td>
tr>
<tr>
<td>密码:td>
<td><input type="password" name="password">td>
tr>
<tr>
<td><input type="submit" value="登录">td>
<td><input type="reset" value="重置">td>
tr>
table>
form>
body>
html>
package com.lut.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookielogin")
public class CookieLoginServlet extends HttpServlet {
private String myusername="admin";
private String mypassword="123456";
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");
String password=req.getParameter("password");
if (username.equals(myusername)&&password.equals(mypassword)){
Cookie cookie=new Cookie("name",username);
Cookie cookie1=new Cookie("password",password);
cookie.setMaxAge(60*60*24);//生命周期设为1day
cookie1.setMaxAge(60*60*24);
resp.addCookie(cookie);
resp.addCookie(cookie1);
resp.sendRedirect("cookie_welcome.jsp");
}else {
resp.sendRedirect("cookie_login.jsp");
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
欢迎回来
<%
Cookie[] cookies=request.getCookies();//一次性获取所有的cookie,用cookie数组存放
for (Cookie cookie:cookies){ //只能通过遍历+条件判断的方式获取
if (cookie.getName().equals("name")){
out.write("用户名:"+cookie.getValue()+"
");
}
if (cookie.getName().equals("password")){
out.write("密 码:"+cookie.getValue()+"
");
}
}
%>
退出登录
注: 登出功能跳转时发生405异常,等待处理…
package com.lut.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookielogin")
public class CookieLoginServlet extends HttpServlet {
private String myusername="admin";
private String mypassword="123456";
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username=req.getParameter("username");
String password=req.getParameter("password");
if (username.equals(myusername)&&password.equals(mypassword)){
Cookie cookie=new Cookie("name",username);
Cookie cookie1=new Cookie("password",password);
cookie.setMaxAge(60*60*24);//生命周期设为1day
cookie1.setMaxAge(60*60*24);
resp.addCookie(cookie);
resp.addCookie(cookie1);
resp.sendRedirect("cookie_welcome.jsp");
}else {
resp.sendRedirect("cookie_login.jsp");
}
}
}
注: 从cookie数组获取信息时,每一次cookie的顺序不一定相同,即下一次有可能先显示 用户名,后显示 密码。