文章目录
Cookie :小饼干
Session :会话
会话
会话
用户打开浏览器,点击很多链接,访问多个web资源,关闭浏览器,这个过程叫做会话
有状态会话
一个网站,怎么证明你来过?
- 服务端给客户端一个信件,客户端下次访问服务端的时候,带上信件就可以了 ; cookie
- 服务端登记你来过了,下次你访问的时候我匹配你 ;session
保存会话的两种技术
cookie
- 客户端技术
session
- 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或数据放在session中
常见案例 :网站第一次登陆之后,第二次就不需要登陆了,直接就是登陆状态了
cookie
案例 :
保存用户上一次访问的时间
1、编写 servlet
import jakarta.servlet.ServletException;
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.PrintWriter;
import java.util.Date;
public class CookieDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
// 服务器从客户端获取 cookie
Cookie[] cookies = req.getCookies();//这里返回的是数组,说明cookie可以是多个
// 判断 cookie 是否存在
if(cookies!=null){
//如果cookie存在
for (int i = 0; i < cookies.length; i++) {
Cookie cookie =cookies[i];
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
out.println("上一次访问的时间为 :");
//获取cookie中的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}else{
//因为浏览器中会默认带有cookie,不只是有我们设置的这一个
out.println("这是你第一次访问!!!");
}
}
}else{
out.println("这是你第一次访问!!!");
}
//服务器响应给浏览器一个cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
//设置 cookie 的有效期 24*60*60 为一天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2、配置 web.xml
<servlet>
<servlet-name>cookie1</servlet-name>
<servlet-class>com.hkp.cookie.CookieDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookie1</servlet-name>
<url-pattern>/cookie1</url-pattern>
</servlet-mapping>
3、启动测试
删除cookie
- 如果不设置 cookie 的有效期,关闭浏览器则自动删除cookie
- 将 cookie 的有效期设置为0,每次访问都会将cookie 删除
案例 :
1、编写 servlet
import jakarta.servlet.ServletException;
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.PrintWriter;
import java.util.Date;
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//方式一
// //获取浏览器中的cookie
// Cookie[] cookies = req.getCookies();
// for (int i = 0; i < cookies.length; i++) {
// if(cookies[i].getName().equals("lastLoginTime")){
// //设置 cookie 的有效期 0 即为删除此 cookie
// cookies[i].setMaxAge(0);
// resp.addCookie(cookies[i]);
// }
// }
//方式二
//创建一个cookie,名字必须和要删除的cookie名字一样
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
//设置 cookie 的有效期 0 即为删除此 cookie
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2、配置 web.xml
<servlet>
<servlet-name>cookie2</servlet-name>
<servlet-class>com.hkp.cookie.CookieDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookie2</servlet-name>
<url-pattern>/cookie2</url-pattern>
</servlet-mapping>
3、启动测试
一个网站 cookie 是否存在上限?
- 一个cookie只能保存一个信息
- 一个 服务器 可以给 浏览器发多个 cookie,但服务器最多存放20个cookie
- cookie大小有限制 – 4kb
- 浏览器 cookie的上限 300 个
session (重点)
什么是 session ?
- 服务器会给每一个用户(浏览器)创建一个 session 对象
- 一个session独占一个浏览器,只要浏览器没关,session就永远存在
- 用户登录后,可以访问整个网站 --> 保存用户的信息
案例
往session中存东西
1、编写 servlet
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
public class SessionDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//获取session
HttpSession session = req.getSession();
//往session 中存东西
session.setAttribute("name","测试");
//获取 sessionID,就是页面中的 JSESSIONID
String sessionId = session.getId();
//判断session是否是新创建的
if(session.isNew()){
out.println("session 是新创建的"+sessionId);
}else{
out.println("session 已经存在了"+sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2、配置 web.xml
<servlet>
<servlet-name>session1</servlet-name>
<servlet-class>com.hkp.session.SessionDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session1</servlet-name>
<url-pattern>/session1</url-pattern>
</servlet-mapping>
3、测试
在另外一个servlet 中获取 session
1、编写 servlet
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
//获取session
HttpSession session = req.getSession();
//获取session的值
String name = (String)session.getAttribute("name");
//将该值输出到网页
resp.getWriter().println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2、配置 web.xml
<servlet>
<servlet-name>session2</servlet-name>
<servlet-class>com.hkp.session.SessionDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session2</servlet-name>
<url-pattern>/session2</url-pattern>
</servlet-mapping>
3、测试
移除session
1、编写servlet
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session
HttpSession session = req.getSession();
//将session中的某个值移除
session.removeAttribute("name");
//注销session,相当于关闭浏览器(改变了JSESSIONID的值,相当于刷新了一次页面)
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2、配置 web.xml
<servlet>
<servlet-name>session3</servlet-name>
<servlet-class>com.hkp.session.SessionDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session3</servlet-name>
<url-pattern>/session3</url-pattern>
</servlet-mapping>
3、测试
不加 session.invalidate();
加上 session.invalidate(); 改变了JSESSIONID的值,相当于刷新了一次页面
注销session
方式一 :手动移除session,测试效果见上面移除session的案例
在 servlet 中 使用session.invalidate();
方式二 :在web.xml 中配置session 的默认失效时间
1、配置web.xml
<!--设置session的默认失效时间-->
<session-config>
<!-- 1分钟后session自动失效,以分钟为单位 -->
<session-timeout>1</session-timeout>
</session-config>
2、启动测试
一分钟后 :session id自动改变
session 和 cookie的区别 :
- cookie是把用户的数据写给用户的浏览器,浏览器中保存(可以保存多个)
- session把用户的数据写到用户独占 session 中,服务端保存(保存重要、常用信息,减少服务端资源浪费)
- session对象有服务端创建