1、Cookie 定义
这是JAVAWEB项目用来进行会话和状态 管理的重要工具,客户端第一次发请求到服务器,不会携带任何cookie数据。那么服务器会判断这是该会话的第一个请求,服务器就创建一个Cookie对象,随响应带回浏览器,浏览器将其保存在本地文件夹,下一次请求时,会携带该文件夹中的数据 ,服务器判断该数据和上次返回的数据一致,可知两次请求来自同一个会话
2、Session——HttpSession,
这表示一次会话,服务器和客户端之间通信默认的Cookie数据就是当前HttpSession会话的id,它是一个键值对
键:JSessinId
值:是一个16进制的唯一数值,每一个会话中的JSessionId都是一样的
代码:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet(value = "/hellocookie")
public class HelloCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
if (cookies != null && cookies.length > 0) {
//已经发过请求
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
} else {
System.out.println("没有cookie,您是第一次访问当前服务器");
//为每一个浏览器创建JSessionID
HttpSession session = req.getSession();//会话,如果浏览器关闭,那就没有
}
}
}
步骤:打开tomcat之后把 复制网址,然后把浏览器关掉
再次输入网址,发出请求,并多次刷新网页
IDEA获得相应
浏览器缓存清除:
知识点:
1、域对象
这是一种用来携带数据的对象,数据以键值对的形式从一个资源被带到了下一个资源
setAttribute(键,值)——存放数据
getAttibute(键)——根据传入的键获取对应的值
removeAttribute(键)——根据传入的键删除对应的键值对
常见域对象
①HttpServletRequest
一次请求
②HttpSession
一次会话(包含了多次请求和响应)浏览器的打开到关闭可以理解为一个会话
我们可以通过request请求调用geySession()获取
③ServletContext
整个Web应用
我们可以通过当前request请求调用getServletContext()获取当前Web应用的对象
3、自定义Cookie对象
我们可以自己创建Cookie对象,我哦们使用new Cookie构造方法,传入键和值即可
然后我们需要将自定义的Cookie对象绑定到response中,使用HttpServletResponse.addCookies(cookie对象)即可
格式:
Cookie cookie = new Cookie("myKey", "myValue");//新建一个Cookie对象
resp.addCookie(cookie);把新建的对象绑到原有的cookie对象上
代码:
package com.iweb.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet(value = "/hellocookie")
public class HelloCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
if (cookies != null && cookies.length > 0) {
//已经发过请求
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
} else {
System.out.println("没有cookie,您是第一次访问当前服务器");
//为每一个浏览器创建JSessionID
HttpSession session = req.getSession();//会话,如果浏览器关闭,那就没有
Cookie cookie = new Cookie("myKey", "myValue");
resp.addCookie(cookie);
}
}
}
输出结果:
以上都是Session ——会话级别的Cookie
4、持久级别的Cookie
Cookie默认都是会话级别,随浏览器关闭而被删除,我们可以调用setMaxAge(秒数)将其设置为持久级别,那么它将不受浏览器开关控制,等有效期到了,它自动删除
格式:
Cookie cookie = new Cookie("myKey", "myValue");
cookie.setMaxAge(30);
代码:
package com.iweb.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet(value = "/hellocookie")
public class HelloCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
if (cookies != null && cookies.length > 0) {
//已经发过请求
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
} else {
System.out.println("没有cookie,您是第一次访问当前服务器");
//为每一个浏览器创建JSessionID
HttpSession session = req.getSession();//会话,如果浏览器关闭,那就没有
Cookie cookie = new Cookie("myKey", "myValue");
cookie.setMaxAge(30);
resp.addCookie(cookie);
}
}
}
运行结果:30秒后自动关闭
注意:
我们可以通过setMaxAge(0)来清除该cookie
如果传入负数作为setMaxAge()的参数,则表示会话级别的cookie
应用:
利用Cookie来写自动登录
大致思路:存两个Cookie对象,一个键值:账号:账号值
密码:密码值
cookie1.setMaxAge=
账号=第一个cookie.
package com.iweb.test;
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(value = "*.user")
public class UserServlet 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 {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("html/text");
String path = req.getServletPath();
switch (path) {
case "/login.user": {
login(req, resp);
break;
}
case "/exit.user": {
logout1(req, resp);
break;
}
default:
break;
}
}
private void logout1(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Cookie[] cookies = req.getCookies();
if (cookies != null && cookies.length > 0) {//如果已经有cookie文件
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
}
}
resp.sendRedirect(req.getContextPath() + "/login.html");
}
private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String username = req.getParameter("username");
if (username != null && username != "") {//当账号名不为空
Cookie userNameCookie = new Cookie("username", username);//创建一一个新的cookie 来存键值对
userNameCookie.setMaxAge(3000);//寿命30s
resp.addCookie(userNameCookie);
} else {//账号为空
Cookie[] cookies = req.getCookies();
if (cookies != null && cookies.length > 0) {//如果已经有cookie文件
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue();//读取cookie文件里存的账号 username是以前
}
}
}
}
if (username != null && !"".equals(username)) {
resp.sendRedirect(req.getContextPath() + "/success.html");
} else {
resp.sendRedirect(req.getContextPath() + "/login.html");
}
}
}
注意:在html文件中 超链接或者 form post表单提交写的没有斜杠
在servlet path中写user